小编典典

这是对象的安全出版物吗?

java

我有一堂课

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引用不会转义,并且对它及其状态的引用是同时发布的,因此使用者线程将看不到过时的值。还是可见性问题。我不知道原因。


阅读 174

收藏
2020-10-12

共1个答案

小编典典

可以安全发布此新Item对象吗?如果没有,为什么?

问题围绕指令的优化和重新排序。当您有两个线程正在使用 同步的构造对象时,出于效率考虑,编译器可能会决定对指令重新排序,并为对象分配内存空间,
然后 在构造函数和构造函数完成 之前 将其引用存储在item字段中。字段初始化。或者,它可以重新排序内存同步,以便其他线程以这种方式 感知
它。

如果将item字段标记为,final则保证构造函数作为构造函数的一部分完成该字段的初始化。否则,在使用锁之前,您将必须同步锁。这是Java语言定义的一部分

这是另外两个参考:

2020-10-12