[英]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 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.