[英]Volatile for publishing effectively immutable objects
Would it be safe to use only volatile
for publishing a mutable object which is never mutated?仅使用
volatile
发布从未发生变异的可变对象是否安全?
class Mutable {
private int i;
Mutable(int i) {
this.i=i;
}
int getI() {
return i;
}
}
This class is accessed by multiple threads:这个类被多个线程访问:
@Singleton
class Holder {
private volatile Mutable effectivelyImmutable = new Mutable(1);
int getI() {
return effectivelyImmutable.getI();
}
void resetMutalbe(int i) {
Mutable newMutable = new Mutable(i);
effectivelyImmutable = newMutable;
}
}
Would all threads get 1 from Holder.getI()
if Holder.resetMutalbe()
is never called?如果从不调用
Holder.resetMutalbe()
所有线程是否会从Holder.getI()
获得 1?
Would all threads get 2 from Holder.getI()
if Holder.resetMutalbe(2)
was called from any thread before Holder.getI()
?如果在
Holder.getI()
之前从任何线程调用Holder.resetMutalbe(2)
,所有线程都会从Holder.getI()
获得 2 吗?
Yes, volatile
is enough, since it creates a happens-before relationship.是的,
volatile
就足够了,因为它创建了一个发生在之前的关系。 Writes to a volatile field happen-before reads to it, so all actions prior to calling Holder#resetMutalbe()
are visible after calling Holder#getI()
.写入volatile字段发生,之前读取它,所以调用之前的所有行动
Holder#resetMutalbe()
的调用后,可见Holder#getI()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.