您的位置:首页 > 其它

记一个关于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());
}
}
}我们来调用下

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的区别。

那么问题来了,这是为什么呢???
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: