java - 非 volatile 多线程写入,线程可见

标签 java multithreading

我有一个变量,我需要设置它的值,我希望线程可见。我不知道哪个线程正在执行读取和写入操作。

该变量只能设置一次,因此通过将其设置为 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/

相关文章:

java - mapreduce程序抛出数组索引超出范围错误

java - 如何将 java 8 添加到 eclipse

Java icmp4j 多线程 ping 不那么多线程

c++ - 线程问题(追自己的尾部)

c - 对于 C 多线程程序,什么是好的跟踪库?

java - 使用委托(delegate)的线程安全

java - Android http 请求出现严重错误

java - 通过上下文对象的同步 getter 实现线程安全

java - 当第一个场景失败时如何跳过所有 cucumber-jvm 场景

multithreading - Xamarin.IOS应用程序不断启动和完成许多线程