java - 根据 Java 内存模型,读取器线程可以看到部分初始化对象的哪些字段值?

标签 java concurrency jvm java-memory-model

更具体地说,假设一个对象已部分初始化,并且该对象的构造函数将字段 x 初始化为 null,那么读取此部分初始化对象的其他线程是否可以看到除 null 之外的任何其他值?

如果我理解正确的话,Java 内存模型本身并不能保证在这种情况下该值始终为 null。问题是:考虑到 CPU 缓存和 JVM 内存架构,是否应该合理地预期该值不能为空?

最佳答案

是的,这是可能的——不能保证一个线程在构造函数中初始化的对象将被另一个线程正确读取。 Java 内存模型允许编译器对构造函数内的语句进行重新排序,只要重新排序不会影响初始化完成时对象的状态。

另一个线程可以在对象分配到内存中之后但在构造函数完成之前获取对该对象的引用,并且可以读取未初始化的值。

您需要使用synchronized关键字或使用同步集合来保护对此类变量的访问。

参见:Java Memory Model

关于java - 根据 Java 内存模型,读取器线程可以看到部分初始化对象的哪些字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45815777/

相关文章:

java - 扩展线程以测试连接是否正确终止?

javascript - 如何在没有冲突的 Node 中创建 tmp 目录

swift - 调度队列异步调用

java - 登录后重定向到 servlet?

java - 如何用JAVA输入输出对话框求三个数的平均值?

c# - 为什么相同的算法在 Scala 中的运行速度比在 C# 中慢得多?以及如何让它更快?

java - 字节码的验证会发生两次吗?

java - 为什么JVM在进入无限递归时不会崩溃?

java - DialogFragment 中未调用 OnCancelListener

java - 在具有重载构造函数的类中传递 null 时首先调用哪个构造函数?