翻译自stackoverflow:
问题:
例1:check then act
if(vector.contains(e))//check
{
vector.remove(e)
}
这有2个线程,线程1在contains后暂停,然后线程2执行了contains并且执行了remove,这时e已经不在vector中了,
然后线程1取消暂停并执行remove,此时报错,因为这时e已经不在vector中了。
例2:read modify write
counter++
这不是自动的操作, 他有3个步骤:1. 取得该值2. 增加该值3. 归属该值
---------分割线---------------------
经典回答:
关于read modify write的经典例子就是上述的counter++了。
关于check then act 的例子很多,一个例子就是当你从ConcurrentHashMap中检查键是否存在然后在if中做些事情(译者注:此例子在书中提到过,网上也有分析,我这里贴出来大家自己思考):
继续翻译:
另一个例子是单例代码:
public Singleton getInstance()
{
if(_instance == null)
{
_instance = new Singleton();
}
}
(译者注:这个一眼就看出来这个单例是有问题的,此处应该加锁,否则可能并发时new出多个实例)
你能在网上读到更多的关于这方面的知识,目前的一本好书是《Java Concurrency in Practice》,作者Brian Goetz。这本书也是有帮助的。