2013-08-27 61 views
1

我想向我自己展示從多個線程訪問變量而不使用任何類型的同步時的線程安全問題visibility我應該用什麼樣的修改來永久創建這個循環?

我運行這個例子從Java Concurrency in Practice

public class NoVisibility { 

    private static boolean ready; 
    private static int number; 

    private static class ReaderThread extends Thread { 

     @Override 
     public void run() { 
      while (!ready) { 
       Thread.yield(); 
      } 
      System.out.println(number); 
     } 
    } 

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

如何使它永遠循環下去,而不是每次運行時打印42(永遠循環意味着變量ready = true;ReaderThread線程修改不適用於main線程)。

+0

這真的是42次運行嗎? – kosa

+0

沒有,印刷'42' – tarrsalah

+0

檢查這個問題:http://stackoverflow.com/questions/2787094/how-to-demonstrate-java-multithreading-visibility-problems有關的「Java併發編程實踐」 [問題 – Katona

回答

1
public static void main(String[] args) throws InterruptedException { 
    new ReaderThread().start(); 
    number = 42; 
    //put this over here and program will exit 
    Thread.sleep(20000); 
    ready = true; 
} 

放置Thread.sleep()通話20秒鐘會發生什麼是JIT將在這20秒踢,這將優化檢查和緩存值,或者乾脆刪除的條件。所以代碼在可見性方面會失敗。

要阻止這種情況發生,你必須使用volatile

+0

並沒有爲我工作。 – tarrsalah

+0

@tarrsalah嘗試增加sleep的值並檢查應用程序中是否禁用了JIT編譯。 –

相關問題