只使用安全吗 volatile
发布一个永远不会变异的可变对象?
class Mutable {
private int i;
Mutable(int i) {
this.i=i;
}
int getI() {
return i;
}
}
此类由多个线程访问:
@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;
}
}
所有线程从 Holder.getI()
如果 Holder.resetMutalbe()
从来没打过电话?
所有的线程从 Holder.getI()
如果 Holder.resetMutalbe(2)
以前从任何线程调用过 Holder.getI()
?
1条答案
按热度按时间kuhbmx9i1#
对,
volatile
这就足够了,因为它创造了一种“先发生后发生”的关系。对易失性字段的写入发生在对其进行读取之前,因此调用之前的所有操作Holder#resetMutalbe()
呼叫后可见Holder#getI()
.