volatile用于有效地发布不可变对象

f4t66c6m  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(283)

只使用安全吗 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() ?

kuhbmx9i

kuhbmx9i1#

对, volatile 这就足够了,因为它创造了一种“先发生后发生”的关系。对易失性字段的写入发生在对其进行读取之前,因此调用之前的所有操作 Holder#resetMutalbe() 呼叫后可见 Holder#getI() .

相关问题