【发布时间】:2019-01-27 08:33:55
【问题描述】:
我一直试图弄清楚如何使用陈旧的引用来观察安全发布的不可变对象。
public final class Helper {
private final int n;
public Helper(int n) {
this.n = n;
}
}
class Foo {
private Helper helper;
public Helper getHelper() {
return helper;
}
public void setHelper(int num) {
helper = new Helper(num);
}
}
到目前为止,我可以理解 Helper 是不可变的并且可以安全地发布。读取线程读取 null 或完全初始化的 Helper 对象,因为它在完全构造之前不可用。解决方案是将 volatile 放在我不明白的 Foo 类中。
【问题讨论】:
-
不清楚你在这里问什么。
helper未安全发布。因此,您需要安全地发布它。 -
@AndyTurner 我是否认为不可变对象可以在不进行额外同步的情况下安全发布的说法不正确?
-
@RubaMushtaq 您不发布对象,而是发布对对象的引用。如果您分发的引用不是最新的,则对象是否安全初始化无关紧要。
-
@AndyTurner 感谢您提及更新参考。
标签: java multithreading thread-safety