java - 可变实例对象的可见性

标签 java multithreading concurrency java.util.concurrent

根据《Java并发实践》一书,当ready为true时,下面的代码可能会永远执行,或者number的值可能仍然为0,建议将变量定义为 volatile 。然而,即使在我多次尝试之后,下面列出的程序似乎总是返回正确的值(42)而不是过时的值。这种现象很少发生吗?

public class NoVisibility {
    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread{
        public void run(){
            System.out.println("Thread started =" + ready + " " + number);
            while(!ready){
                Thread.yield();
            }
            System.out.println("value is" + number);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new ReaderThread().start();
        Thread.sleep(10000);
        number = 42;
        ready = true;
    }
}

最佳答案

Is this a phenomenon that occurs very rarely

是的,很少见。然而,考虑到计算机每秒执行数十亿次的操作,罕见的情况很常见

每当跨线程访问资源时,您必须地址 thread-safety 。否则,您的应用程序在部署中将会遇到零星的错误,这些错误即使不是不可能解决也是非常困难的。

按照同样的逻辑,测试并发错误是出了名的困难,正如您在问题中所看到的。

始终尽可能避免使用线程代码。例如,利用 immutable objectsdefensive copies .

必读:Java Concurrency in Practice作者:Brian Goetz 等人。

关于java - 可变实例对象的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64851292/

相关文章:

java - 使用 HBase MapReduce 将文件名作为行键插入

java - 如何在 Java 中定义 F<T> 和 F<T,U> 和 F<T,U,V> 接口(interface)?

python - 如何限制并发worker数量?

python - python 中限制线程的规范/标准方法

c++ - 真正测试std::atomic是否无锁

java - 从 W3CEndpointReference 获取服务 URL

java - gnuprologjava问题

C++ - 生产者/消费者只允许消费定义的 block

python - subprocess.call 的管道输出到进度条

java - 静态同步方法与所有代码都在同步块(synchronized block)中的静态方法