请解释Java内存模型中阐明的初始化安全性
问题内容:
- 有人可以解释Java内存模型所要求的 初始化安全性 吗?
- 最终 字段如何帮助实现 初始化安全 ?
- 什么样的作用的 构造 在确保发挥 初始化安全 ?
问题答案:
初始化安全性允许对象在其完全构造(初始化)状态下被外部线程看到。前提是该对象不应过早发布。在其构造函数中。一旦确保这一点,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
此安全性来实现内存可见性(发生前关系)。