项目符号点2和3之间有什么区别?
volatile
基本上意味着对该字段的任何写入都将从其他线程可见。因此,当您将字段声明为volatile:时private volatile SomeType field;
,可以确保如果构造函数向该field:写入内容,则field = new SomeType();
其他随后尝试读取的线程将看到此分配field
。final
具有相似的语义:如果有一个final字段,则可以保证:private final SomeType field;
对该字段的写入(在声明中或在构造函数中): 如果对象正确,field = new SomeType();
将不会重新编写该字段,并且其他线程可以看到该字段 已发布 (this
例如,无法逃脱)。
显然,主要区别在于,如果该字段为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(); }}


