简体   繁体   English

Volatile 用于发布有效的不可变对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM