import java.util.concurrent.TimeUnit;
/**
* @author gl65293
*
*/
public class StopThread {
/**
* @param args
*/
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable(){
public void run(){
int i = 0;
while(!stopRequested){
i++;
}
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
在Effective Java 中文版 第二版的230页,说的是这个程序不会停下来. 可你把这个程序放入到eclipse这种ide里去执行的时候,你却发现在很多时候,这个程序都会在执行1秒后停下来. 为什么呢? 这个怎么跟书上说的不一样?
其实, 书上跟自己的实践都是对的, 在eclipse ide里执行这个程序里, 你要加上 -server参数, 这个程序运行就不会停下来了.
这是为什么呢?
因为在加上 -server参数后, jvm会对执行顺序进行优化.
解释如下:
backgroundThread什么时候退出循环是不能确定的,有可能1秒后就退出了,也有可能永远不会退出。程序执行时有如下2中可能情况:
第一种可能,由于stopRequested没有同步或者volatile修饰,jvm为了加快线程的执行速度,每个线程都会对stopRequested做变量拷贝,这时候对变量的修改可能就不会或者不能够及时同步到每个线程中,这种情况backgroundThread 线程什么时候执行结束是不能确定的,>=1秒后结束,或者永远不会结束都有可能。
第二种可能,jvm会对
while(!stopRequested){
i++;
}
做优化,优化后程序执行流程变为
if(!stopRequested) {
while(true){
i++;
}
}
,这种情况,backgroundThread线程永远不会结束。
为了避免以上两种情况,可以用volatile修饰stopRequested,这样每个线程在修改stopRequested后都会把修改结果同步到主内存,每个线程在读取stopRequested时都会从主内存中获取;volatile同时也阻止了jvm对第二种情况的优化
建议细看: 《java并发编程实践》
注:
在不加 volatile修饰, 把i++改成System.out.println("t"); 的情况下, 使用-server, -client参数都会在1秒后退出.
在windows下,jvm默认是client模式, 在linux下默认是 server模式.
参考:
Java线程安全兼谈DCL
用happen-before规则重新审视DCL
分享到:
相关推荐
Java 多线程与并发(3_26)-Java 并发 - Java中所有的锁
62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...
Java 多线程与并发(1_26)-Java 并发 - 理论基础
Java 多线程与并发(2_26)Java 并发 - 线程基础
Java 多线程与并发-Java并发知识体系详解
Java并发--任务执行.pdf
java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea
Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...
目录:一、创建和销毁对象 (1 ~ 7)二、对于所有对象都通用的方法 (8 ~ 12)三、类和接口 (13 ~ 22)四、泛型 (23 ~ 29)五、枚举和注解 (30 ~ 37)六、方法 (38 ~ 44)七、通用程序设计 (45 ~ 56)八、异常 ...
自用ppt-2012-11-11java线程并发库自用ppt-2012-11-11java线程并发库
实战Java高并发程序设计-随书代码 完整版
Java并发编程的艺术 作者:方腾飞 魏鹏 程晓明 著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
并发编程专并发编程专题-Java
java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
人工智能-项目实践-多线程-Java多线程高并发实例 Java多线程高并发实例
JAVA并发-自问自答学ThreadLocal
Java并发编程---synchronized关键
什么是Java中的面向对象编程(OOP)?列举OOP的原则。...什么是Java中的并发编程?列举一些常见的并发类和工具。 什么是Java中的线程池?如何创建和使用线程池? 什么是Java中的Callable和Future接口?如何使