【发布时间】:2016-04-09 23:36:13
【问题描述】:
我想了解发布不可变对象是否需要volatile。
例如,假设我们有一个不可变对象A:
// class A is immutable
class A {
final int field1;
final int field2;
public A(int f1, int f2) {
field1 = f1;
field2 = f2;
}
}
然后我们有一个类B,可以从不同的线程访问。它持有对 A 类对象的引用:
// class B publishes object of class A through a public filed
class B {
private /* volatile? */ A toShare;
// this getter might be called from different threads
public A getA(){
return toShare;
}
// this might be called from different threads
public void setA(num1, num2) {
toShare = new A(num1, num2);
}
}
从我的阅读来看,不可变对象似乎可以通过任何方式安全地发布,这是否意味着我们不需要将toShare 声明为volatile 以确保其内存可见性?
【问题讨论】:
-
如果任何线程能够通过
toShare检索到A对象的引用,则保证A对象被完全初始化。 -
但是检索到的
A会是最新的值吗?因为其他线程可能会通过setA方法更新toShare。 JVM是否保证更新的值不会在设置线程本地缓存?
标签: java concurrency parallel-processing java.util.concurrent