我有一个变量,我需要设置它的值,我希望线程可见。我不知道哪个线程正在执行读取和写入操作。
该变量只能设置一次,因此通过将其设置为 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;
}
}
并且由于“happens-before”原则,该值将被写出到内存中。这是正确的吗?
最佳答案
不要将其设置为 volatile
。作为一条经验法则,如果该变量的值正在更改并且多个线程读取/写入该变量,请使用 volatile 。在您的情况下,您希望缓存读取。因为 x 的值不会改变。使用 volatile 会降低性能 在您的情况下,您只需确保 set()
发生在 get()
之前。这实际上会发生,因为除非 someThread
通知其他线程,否则其他线程将不会读取 x 的值。
PS:我假设其他线程不会读取 x
的值,除非收到通知。如果我的问题有误,请告诉我。
关于java - 非 volatile 多线程写入,线程可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28234421/