考虑下面的代码狙击手:
package sync;
public class LockQuestion {
private String mutable;
public synchronized void setMutable(String mutable) {
this.mutable = mutable;
}
public String getMutable() {
return mutable;
}
}
在时间1,线程Thread1将更新“可变”变量。在setter中需要同步,以便将内存从本地缓存刷新到主内存。
在时间Time2(时间2>时间1,无线程争用)下,线程Thread2将读取可变的值。
问题是–我需要在getter之前进行同步吗?看起来这不会造成任何问题-内存应该是最新的,并且Thread1应该使Thread2的本地缓存无效和更新,但是我不确定。
最佳答案
不用奇怪,为什么不只在java.util.concurrent中使用原子引用呢?
(对于它的值(value),我对happens-before的阅读并不能保证Thread2会看到可变的更改,除非它也使用了同步的...但是我总是对JLS的这一部分感到头疼,因此请使用原子引用)