当前位置: 首页 > 面试题库 >

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

轩辕阳焱
2023-03-14
问题内容
  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此安全性来实现内存可见性(发生前关系)。



 类似资料:
  • 当我在执行语句后检查分配给的内存地址时,我发现内存内容为0。因为我读到没有将内存初始化为0,所以这是正确的行为吗?

  • 问题内容: 年复一年,我试图了解部分与内存模型和并发交易的Java规范。我不得不承认我失败了。是的,我了解锁和“同步”,wait()和notify()。我可以很好地使用它们,谢谢。对于“ volatile”的作用,我什至不清楚。但是所有这些都不是来自语言规范,而是来自一般经验。 这是我要问的两个示例问题。我对特定答案不太感兴趣,因为我需要了解答案是如何从规范中得出的(或者可能是我得出结论,规范没有

  • 问题内容: 众所周知,arraylist是init。应该是这样的 那么,为什么Java允许这些? 那么,如果它们是正确的,为什么不允许这些? 编译器消息是:ArrayList类型的方法add(int,capture#1-of?extended Object)不适用于参数(int) 更一般 我读到了这件事,但很高兴收到您的来信。谢谢 另一个有趣的地方是: 问题答案: 您不能为类型的引用分配,因为它允

  • 本文向大家介绍Java 数组声明、创建、初始化详解,包括了Java 数组声明、创建、初始化详解的使用技巧和注意事项,需要的朋友参考一下 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程

  • 本文向大家介绍详解Nginx中基本的内存池初始化配置,包括了详解Nginx中基本的内存池初始化配置的使用技巧和注意事项,需要的朋友参考一下 ngx_cycle 的初始化 整个初始化过程中,最重要的就是全局变量 nginx_cycle 的初始化,很多变量都是在这个过程中初始化的 nginx_cycle 又是通过两个局部变量 init_cycle 和 cycle 实现初始化的 事实上,日志初始化也可以

  • 问题内容: 我试图基于初始化按需持有人习惯用法创建一个线程安全的单例类。这是我的代码 我的期望是以线程安全的方式初始化ExecutorService,并且那里只有一个实例(静态)。 这段代码是实现了这一目标-还是需要任何更改? 问题答案: 根据SEI 指南,您的方法很好。 但是,由于我们有枚举,因此可以使用枚举的简单方法: 而且,如果您想变得真正聪明,还可以定义枚举实现的接口。因为这样您以后可以