原文截圖:java
import java.util.concurrent.TimeUnit; public class ThreadStopExample { private static volatile boolean stop; // private static boolean stop; public static void main(String[] args) throws InterruptedException { Thread workThread = new Thread(new Runnable() { @Override public void run() { int i =0 ; while(!stop){ i++; try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } }); workThread.start(); TimeUnit.SECONDS.sleep(3); stop = true; } }
按照書中的例子原封不動的敲下來ide
反編譯後的截圖:this
並不像書中的那樣 if(!stop) while(true).......[備註:我使用的是JDK7]code
原書截圖get
以下it
但願做者李林峯大哥能給你讀者一個解釋(這裏絕沒有詆譭的意思 只是對技術的‘吹毛求疵’,林峯大哥也是了不得的- 華爲的BME平臺的項目經理,很是喜歡裏面的 bme 標籤庫 )io
無心之間 我寫例外一個程序發現了能很好說明 volatile的用法例子 費話很少說先上
編譯
public class Increate2 { volatile int i = 0; volatile boolean finished; public synchronized void increate(){ i++; } public synchronized int current(){ return i; } public void setFinished(boolean b){ this.finished = b; } public static void main(String[] args) { for (int j = 0; j < 10; j++) { final Increate2 increate = new Increate2(); for (int i = 0; i < 2000; i++) { new Thread(new Runnable() { @Override public void run() { increate.increate(); if(Thread.currentThread().getName().equals("1999")){ System.out.println("Finished"); increate.setFinished(true); // System.out.println(increate.current()); } } },""+i).start(); } // while(increate.finished){ // System.out.println(increate.current()); // break; // } for (;;) { if(increate.finished){ System.out.println(increate.current()); break; } } } } }
作這個實驗我也是費了一番周折class
一、先把代碼運行一下 看結果 看反編譯文件import
二、把finished volatile修飾去掉 再運行 看結果 看反編譯文件
三、把 for(;;)註釋掉 把while 放開 運行 看結果 看反編譯文件
四、把 finished volatile修飾增長 再運行 看結果 看反編譯文件
時間緊 運行結果我也不貼出來了 動動手試試看 你會發現一些奧祕~~~