原文截图:
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;
}
}
按照书中的例子原封不动的敲下来
反编译后的截图:
并不像书中的那样 if(!stop) while(true).......[备注:我使用的是JDK7]
原书截图
如下
希望作者李林峰大哥能给你读者一个解释(这里绝没有诋毁的意思 只是对技术的‘吹毛求疵’,林峰大哥也是了不起的- 华为的BME平台的项目经理,非常喜欢里面的 bme 标签库 )
无意之间 我写例外一个程序发现了能很好说明 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;
}
}
}
}
}
做这个实验我也是费了一番周折
1、先把代码运行一下 看结果 看反编译文件
2、把finished volatile修饰去掉 再运行 看结果 看反编译文件
3、把 for(;;)注释掉 把while 放开 运行 看结果 看反编译文件
4、把 finished volatile修饰增加 再运行 看结果 看反编译文件
时间紧 运行结果我也不贴出来了 动动手试试看 你会发现一些奥秘~~~