记一个关于volatile作状态标志的很奇怪的问题
2017-05-21 18:54
239 查看
看了不少书,讲了很多关于volatile的知识,但是对于volatile一直很疑惑,问题之一,就是关于volatile的经典例子,我第一个就跑不通,比如下面的经典代码,很多关于volatile的例子都是这么写的
class StopTester {
boolean shutdownRequested;
public void shutdown() {
shutdownRequested = true;
System.out.println("Thread GG");
}
public void doWork() {
while (!shutdownRequested) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis());
}
}
}我们来调用下
我在idea中实际运行,无论给不给加不加volatile,程序都能够正常退出。此时的我.........
今天意外看到这篇2010年的文章
http://marlonyao.iteye.com/blog/636599
我也尝试去掉while(){}循环内语句
再次运行, 发现volatile有效果了,或者说之前不加volatile也有的效果现在没有了,看到了加不加volatile的区别。
那么问题来了,这是为什么呢???
class StopTester {
boolean shutdownRequested;
public void shutdown() {
shutdownRequested = true;
System.out.println("Thread GG");
}
public void doWork() {
while (!shutdownRequested) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis());
}
}
}我们来调用下
public class VolatileTest { public static void main(String[] args) throws Exception { final StopTester stopTester = new StopTester(); new Thread(){ @Override public void run(){ stopTester.doWork(); } }.start(); Thread.sleep(5000); stopTester.shutdown(); System.out.println("main GGG"); } }
我在idea中实际运行,无论给不给加不加volatile,程序都能够正常退出。此时的我.........
今天意外看到这篇2010年的文章
http://marlonyao.iteye.com/blog/636599
我也尝试去掉while(){}循环内语句
public void doWork() { while (!shutdownRequested) { // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(System.currentTimeMillis()); } }
再次运行, 发现volatile有效果了,或者说之前不加volatile也有的效果现在没有了,看到了加不加volatile的区别。
那么问题来了,这是为什么呢???
相关文章推荐
- 很奇怪的一个问题,是关于sql参数化和传where in 参数的迷惑.请大伙给讲讲吧...小弟很迷糊现在.各位园友,拉兄弟一把!!
- 今天碰到一个很奇怪的问题,关于存储过程,留下以后用
- QT中关于头文件一个很奇怪的问题
- 关于UIWebView一个很奇怪问题的另类解决办法(高度递增问题)
- VC中的一个很奇怪的问题--关于C4244
- VC中的一个很奇怪的问题--关于C4244
- 【随笔★DataReader的疑惑】关于使用DataReader的一个很奇怪的问题,不应该用DataReader?
- 一个很奇怪的问题 关于SelectByPoint 待解决
- QT中关于头文件一个很奇怪的问题
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- 有关一个 iframe 的问题,关于在 iframe 内的页面内登录成功后,如何由当前页直接转到另一个页面内?
- 关于SQL的存储过程一个悬而未决的老问题
- 关于数据库备份的一个问题??
- 关于CreateService的一个大问题:权限问题
- 一个关于重定向的问题研究,应该具有实用性
- 一个关于Schema的问题,请求帮助
- 一个关于bin目录下DLL动态编译的问题
- java 中关于package的一个问题
- 关于统计的一个sql问题,使用动态sql语句实现。
- 关于测试一个windows动态链接库的问题;请教各位大侠!