从书Java并发的安全出版物中的做法:最终VS挥发性guaranntee w.rt对象
要安全地发布对象,无论是 参考对象和 对象的状态必须进行其他线程同时可见到 。甲 正确构造的对象可以是 安全地发布:
初始化从静态初始化
存储对它的引用到易失性字段或的AtomicReference
存储一个对象引用参考它到一个正确构建的最终字段 对象
St或者将其引用到由锁定适当保护的字段中。
我的问题是:
- 有什么要点2和3之间的区别?我对
volatile
方法和final
方法之间的差异感兴趣。 - 他指的是第3点的正确构造对象的最终字段是什么意思?在开始使用bulleted points之前,作者已经提到他们正在讨论一个正确构造的对象(我认为它不会让
this
引用转义)。但是为什么他们又提到了构造正确的物体呢?
如果在构造完成后,我改变了像field.setX(new X())这样的字段引用的对象的状态,当我们声明它为volatile时,这个变化是否也保证被其他线程看到?还是它只是给初始化安全?最后在这种情况下呢? – Geek 2013-02-10 04:36:33
不,只有'field'为您提供(重新)分配的可视性保证。除非'x'也是不稳定的,'field.x = new X();'(或者你的setter例子)不提供这样的保证。 – assylias 2013-02-10 07:48:15
同样适用于final,推论如果'field'的所有成员都是final也是不可变的,则field不可变,因此它是线程安全的。 – assylias 2013-02-10 07:49:58