更具体地说,假设一个对象已部分初始化,并且该对象的构造函数将字段 x 初始化为 null,那么读取此部分初始化对象的其他线程是否可以看到除 null 之外的任何其他值?
如果我理解正确的话,Java 内存模型本身并不能保证在这种情况下该值始终为 null。问题是:考虑到 CPU 缓存和 JVM 内存架构,是否应该合理地预期该值不能为空?
最佳答案
是的,这是可能的——不能保证一个线程在构造函数中初始化的对象将被另一个线程正确读取。 Java 内存模型允许编译器对构造函数内的语句进行重新排序,只要重新排序不会影响初始化完成时对象的状态。
另一个线程可以在对象分配到内存中之后但在构造函数完成之前获取对该对象的引用,并且可以读取未初始化的值。
您需要使用synchronized关键字或使用同步集合来保护对此类变量的访问。
关于java - 根据 Java 内存模型,读取器线程可以看到部分初始化对象的哪些字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45815777/