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

Inq*_*ive 18 java multithreading synchronization thread-safety java-memory-model

  1. 有人可以解释Java内存模型所要求的初始化安全性吗?
  2. 最终字段如何帮助实现初始化安全性
  3. 构造函数在确保初始化安全性方面起到了什么作用?

Bha*_*kar 27

初始化安全性允许外部线程在其完全构造(初始化)状态下看到对象.前提条件是不应过早发布对象,即.在它的构造函数中.一旦确保这一点,JMM就要求声明为的字段具有某些行为final.首先,所有final对象字段都被保证在外部线程处于完全初始化状态时被看到 - 这并不像听起来那么简单 -

考虑一堂课

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

}
Run Code Online (Sandbox Code Playgroud)

访问该线程listA的情况下是默认情况下不保证看到该列表中的10个元素.事实上,这个线程甚至可以list看作null.但是,如果list声明了final,那么,根据JMM的要求,list必须始终使用10个元素初始化它.

其次,这种初始化保证不仅限于final字段本身,而是递归地扩展到它所引用的所有对象.例如,如果list上面的例子中是lists本身的列表,那么外部线程保证看到内部列表完全初始化.

请注意,我们无处可synchronized用于在内存可见性方面实现此安全性(在关系之前发生).

  • +1表示初始化安全不仅保证最终字段的安全,而且还保证最终字段引用的对象的安全。 (3认同)