public class VolatileOne { private static boolean ready ; private static int number ; private static class ReaderThread extends Thread{ @Override public void run() { while (!ready){ Thread.yield(); } System.out.print(number); } } public static void main(String[] args) { new ReaderThread().run(); ready = true; number = 50; }}運行這段代碼后,程序并沒有停止,這很明顯,因為線程將準備好的變量備份到自己進程的內存中。當我使用 volatile 關鍵字修改 readprivate volatile static boolean ready ;此時讀取的變量不會被復制到進程內存中。但程序不能停止。什么原因?它與靜態關鍵字有關嗎?如果你想讓程序輸出50并返回,你應該怎么做?
1 回答

德瑪西亞99
TA貢獻1770條經驗 獲得超3個贊
您需要調用
start
才能在另一個線程中執行代碼。檢查這個run
和之間的區別start
。打電話
join
等待ReaderThread
完成。volatile
關鍵字可以在寫線程和讀線程之間建立起一個happens-before關系,你可以放number = 50;
beforeready = true;
,這樣可以保證讀者會注意到number
是50
什么時候注意到ready
的true
。
例子:
Thread reader = new ReaderThread();
reader.start();
number = 50;
ready = true;
reader.join();
添加回答
舉報
0/150
提交
取消