原文截图: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修饰增长 再运行 看结果 看反编译文件
时间紧 运行结果我也不贴出来了 动动手试试看 你会发现一些奥秘~~~