java非易失性多线程写入,线程可见
我有一个变量,我需要设置我希望线程可见的值。我不知道什么样的线程在读写
变量只设置一次,通过将其设置为volatile
我防止从CPU缓存读取变量值(或者我的理解是这样的)。写一次,读很多
我无法将此变量放入构造函数以使用final
我的大致流程是:
thread 1: set value x
thread 1: fire notification to say x is ready.
thread 2: read x.
我的理解是,我可以做到以下几点:
public void setX(int value) {
Object o = new Object();
synchronized(o) {
this.x = value;
}
}
由于“先发生后发生”原则,该值将被写入内存。对吗
# 1 楼答案
不要将其设置为
volatile
。根据经验,如果变量的值正在更改,并且多个线程对该变量进行了读/写操作,请使用volatile
。在你的例子中,你希望读取被缓存。因为x的值不会改变。使用volatile将降低性能在您的情况下,您只需确保set()
发生在get()
之前。这实际上会发生,因为除非someThread
通知另一个线程,否则另一个线程不会读取x的值PS:我假设其他线程不会读取
x
的值,除非得到通知。如果我误解了你的问题,请告诉我# 2 楼答案
在方法中创建的对象上同步是没有意义的。 你如何
notify()
所有阅读线程是一个你需要自己回答的问题——你打算让他们wait()
为这个通知做准备吗? 如果尚未设置值,我建议从getter返回null
或throw