阅读《Java并发编程实战》之后,我了解到:
要安全地发布一个对象,必须同时使其他线程看到对该对象的引用和状态。可以通过以下方法安全地构造对象:
- 从静态初始化器中初始化对象引用
- 将引用存储到
volatile
类型的字段或AtomicReference
中 - 将引用存储到经过正确构造的对象的
final
字段中 - 将引用存储到由锁保护的字段中
然而,第二种方式让我感到困惑。因为volatile
只能保证另一个线程看到引用,但它没有同步所引用的对象的构造。那么,它如何保证可变对象已经被正确地构造?如果正在构造该对象的线程被另一个线程中断怎么办?
final
字段的对象的构造函数不会泄漏对this
的引用,并且在完全初始化之前,没有任何东西可以看到该对象。这提供了可见性。 - erickson