簡體   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