记一个关于volatile作状态标志的很奇怪的问题

来源:互联网 发布:阿里巴巴比淘宝贵2016 编辑:程序博客网 时间:2024/05/18 07:53

看了不少书,讲了很多关于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(){@Overridepublic 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的区别。

那么问题来了,这是为什么呢???