gpt4 book ai didi

java - 这是对象的安全发布吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:42:56 25 4
gpt4 key购买 nike

我有一个类Item

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,新 Item 发布时没有完全构造,但在我看来,新 Item 是完全构造的:它的 this 引用没有逃逸并且对它的引用和它的状态是同时发布的,所以消费者线程不会看到过时的值。或者是可见性问题。我不完全知道原因。

最佳答案

Can this new Item object be safely published? If not, why?

问题围绕指令的优化和重新排序展开。当你有两个线程正在使用一个没有同步的构造对象时,编译器可能会为了效率而决定重新排序指令并为对象分配内存空间并将其引用存储在 item 字段 before 它以构造函数和字段初始化结束。或者它可以重新排序内存同步,以便其他线程以这种方式感知它。

如果您将 item 字段标记为 final,那么构造函数将保证作为构造函数的一部分完成该字段的初始化。否则,您将必须在使用锁之前对其进行同步。这是 Java language definition 的一部分.

这是另外几个引用资料:

关于java - 这是对象的安全发布吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com