Netty權威指南關於 volatile關鍵字的錯誤

原文截圖: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修飾增長 再運行 看結果 看反編譯文件

時間緊 運行結果我也不貼出來了 動動手試試看 你會發現一些奧祕~~~

相關文章
相關標籤/搜索