繁体   English   中英

可变实例对象的可见性

[英]Visibility of mutable instance objects

根据“Java 并发实践”一书,下面的代码可能会永远执行,或者当 ready 为真时,数字的值可能仍然为 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;
    }
}

这是一种很少发生的现象吗

是的,很少见。 然而,鉴于计算机每秒执行数十亿次操作,罕见是很常见的

每当跨线程访问资源时,您必须解决线程安全问题 否则,您部署中的应用程序将遭受零星的错误,这些错误即使不是不可能解决也是非常困难的。

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

始终尽可能避免使用线程代码。 例如,利用不可变对象防御性副本

必读阅读:Brian Goetz 等人的Java Concurrency in Practice

作者说服务器 JVM 比客户端 JVM 执行更多优化。 他书中的一段话

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM