初始化安全性允许对象在其完全构造(初始化)状态下被外部线程看到。前提是该对象不应过早发布。在其构造函数中。一旦确保这一点,JMM就要求对声明为的字段进行某些操作
final。首先,
final保证所有对象字段都可以由处于完全初始化状态的外部线程看到。这听起来并不简单。
考虑一个类:
class A { List list; A() { list = Arrays.asList(some init expressions that adds 10 elements to list); }}访问该线程
list的
A's实例是默认情况下不保证看到该列表中的10个元素。实际上,该线程甚至可以
list视为
null。但是,如果
list声明了
final,那么,按照JMM的要求,
list必须始终似乎在其中初始化了10个元素。
其次,此初始化保证不限于
final字段本身,而是递归扩展到它引用的所有对象。例如,如果
list上例中的本身是列表的列表,则可以保证外部线程将内部列表视为已完全初始化。
请注意,我们在任何地方都无法使用
synchronized此安全性来实现内存可见性(发生前关系)。



