gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:38:44 27 4
gpt4 key购买 nike

  1. 有人能解释一下 Java 内存模型所要求的初始化安全吗?
  2. final 字段如何帮助实现初始化安全
  3. 构造函数在确保初始化安全中扮演什么角色?

最佳答案

初始化安全性规定对象在其完全构造(初始化)状态下可以被外部线程看到。前提是该对象不应过早发布,即。在它的构造函数中。一旦确保这一点,JMM 就要求声明为 final 的字段具有特定行为。首先,所有 final 对象字段都保证在其完全初始化状态下可以被外部线程看到。这并不像听起来那么微不足道。

考虑一个类:

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

}

访问 A 的 实例的 list 的线程在默认情况下不能保证在该列表中看到 10 个元素。事实上,该线程甚至可以将 list 视为 null。但是,如果 list 被声明为 final,那么,根据 JMM 的要求,list 必须始终显示为包含 10 个元素的初始化。

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

请注意,我们没有在任何地方使用synchronized 来实现这种内存可见性安全(先发生关系)。

关于java - 请解释 Java 内存模型中阐明的初始化安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11306032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com