我有一堂课
class Item { public int count; public Item(int count) { this.count = count; } }
然后,我将在其他类的字段中引用Item
class Holder { public Item item; public Holder() { item = new Item(50); } }
可以安全发布此 新Item 对象吗?如果没有,为什么?根据Java Concurrency in Practice,在 未完全构建 新项目的情况下发布了新项目,但在我看来,新项目已被完全构建:它的this引用不会转义,并且对它及其状态的引用是同时发布的,因此使用者线程将看不到过时的值。还是可见性问题。我不知道原因。
this
可以安全发布此新Item对象吗?如果没有,为什么?
问题围绕指令的优化和重新排序。当您有两个线程正在使用 不 同步的构造对象时,出于效率考虑,编译器可能会决定对指令重新排序,并为对象分配内存空间, 然后 在构造函数和构造函数完成 之前 将其引用存储在item字段中。字段初始化。或者,它可以重新排序内存同步,以便其他线程以这种方式 感知 它。
item
如果将item字段标记为,final则保证构造函数作为构造函数的一部分完成该字段的初始化。否则,在使用锁之前,您将必须同步锁。这是Java语言定义的一部分。
final
这是另外两个参考: