来自《Java并发实践》一书:
为了安全地发布对象,
对对象的引用和
对象的状态必须可见
同时其他线程。 A
正确构造的对象可以是
安全发布者:
我的问题是:
- 要点 2 和要点 3 有什么区别?我对两者之间的区别感兴趣
volatile
方法和final
对象安全发布方面的方法。
- 他说的最后一场是什么意思一个正确构造的对象在第 3 点?在开始要点之前,作者已经提到他们正在谈论一个正确构造的对象(我认为这不会让
this
参考逃逸)。但他们为什么再次提到正确构造的物体呢?
要点 2 和要点 3 有什么区别?
-
volatile
基本上意味着对该字段的任何写入都可以从其他线程中看到。因此,当您将字段声明为易失性时:private volatile SomeType field;
,如果构造函数写入该字段,您可以保证:field = new SomeType();
,此分配将对随后尝试读取的其他线程可见field
.
-
final
具有非常相似的语义:如果您有一个最终字段,您可以保证:private final SomeType field;
写入该字段(在声明中或在构造函数中):field = new SomeType();
不会被重新排序并且对其他线程可见如果对象已正确发布(即无法逃脱this
例如)。
显然,主要的区别在于,如果该字段是最终字段,则只能分配一次。
第 3 点中正确构造的对象的最终字段是什么意思?
例如,如果您让this
从构造函数中逃脱,最终语义提供的保证消失了:观察线程可能会看到具有默认值的字段(对象为 null)。如果该对象构造正确,则不会发生这种情况。
人为的例子:
class SomeClass{
private final SomeType field;
SomeClass() {
new Thread(new Runnable() {
public void run() {
SomeType copy = field; //copy could be null
copy.doSomething(); //could throw NullPointerException
}
}).start();
field = new SomeType();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)