请解释Java内存模型中阐明的初始化安全性


问题内容
  1. 有人可以解释Java内存模型所要求的 初始化安全性 吗?
  2. 最终 字段如何帮助实现 初始化安全
  3. 什么样的作用的 构造 在确保发挥 初始化安全

问题答案:

初始化安全性允许对象在其完全构造(初始化)状态下被外部线程看到。前提是该对象不应过早发布。在其构造函数中。一旦确保这一点,JMM就要求对声明为的字段进行某些操作final。首先,final保证所有对象字段都可以由处于完全初始化状态的外部线程看到。这听起来并不简单。

考虑一个类:

class A {
   List list;
   A() {  
      list = Arrays.asList(some init expressions that adds 10 elements to list);
    }

}

访问该线程listA's实例是默认情况下不保证看到该列表中的10个元素。实际上,该线程甚至可以list视为null。但是,如果list声明了final,那么,按照JMM的要求,list必须始终似乎在其中初始化了10个元素。

其次,此初始化保证不限于final字段本身,而是递归扩展到它引用的所有对象。例如,如果list上例中的本身是列表的列表,则可以保证外部线程将内部列表视为已完全初始化。

请注意,我们在任何地方都无法使用synchronized此安全性来实现内存可见性(发生前关系)。