从实践中的Java并发性书中:
为了安全地发布对象,必须同时使对该对象的引用和该对象的状态对其他线程可见。可以通过以下方式安全地发布正确构造的对象: 从静态初始化程序初始化对象引用 将对它的引用存储到volatile字段或AtomicReference中 将对其的引用存储到正确构造的对象的最终字段中 将对它的引用存储到由 锁适当保护的字段中。
为了安全地发布对象,必须同时使对该对象的引用和该对象的状态对其他线程可见。可以通过以下方式安全地发布正确构造的对象:
从静态初始化程序初始化对象引用
将对它的引用存储到volatile字段或AtomicReference中
将对其的引用存储到正确构造的对象的最终字段中
将对它的引用存储到由 锁适当保护的字段中。
我的问题是:
volatile
final
this
项目符号点2和3之间有什么区别?
private volatile SomeType field;
field = new SomeType();
field
private final SomeType field;
显然,主要区别在于,如果该字段为final,则只能分配一次。
在点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(); } }