我有一个变量,我需要设置我想要线程可见的值。我不知道什么线程正在阅读写作。
变量只设置一次,因此设置为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;
}
}
由于before-before原则,该值将被写入内存。这是对的吗?
答案 0 :(得分:1)
请勿将其设为volatile
。作为一个拇指规则,如果该变量的值正在改变并且多个线程读/写该变量,则使用volatile
。在您的情况下,您希望缓存读取。因为x的值不会改变。使用volatile将降低性能在您的情况下,您只需确保set()
发生在get()
之前。实际上会发生这种情况,因为除非someThread
通知另一个线程,否则另一个线程将不会读取x的值。
PS:我假设其他线程除非得到通知,否则不会读取x
的值。如果我的问题出错,请告诉我。
答案 1 :(得分:0)
在方法中创建的对象上进行同步是没有意义的。
如何notify()
所有阅读主题都是您需要自己回答的问题 - 您打算让他们wait()
收到此通知吗?
如果尚未设置值,我建议您从getter返回null
或throw
...