check then act and read modify write

来源:互联网 发布:车机安卓软件 apk 编辑:程序博客网 时间:2024/04/29 22:52

翻译自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。这本书也是有帮助的。





0 0
原创粉丝点击