page contents

volatile使用的一点不解

Pack 发布于 2020-01-07 16:36
阅读 946
收藏 0

下面代码为什么while里循环不会停止,在循环体力有读取变量就会停止?

public class VolatileTest {

    static boolean finish=false;

    public static void main(String[] args) throws InterruptedException {

        new Thread(()->{

            System.out.println("thread1 running");

            while (!finish){

//有这个操作就会终止                    

//System.out.println(finish);


            }

            System.out.println("thread1 end");

        }).start();

        TimeUnit.SECONDS.sleep(5);

        new Thread(()->{

            System.out.println("thread2 running");

            finish=true;

            System.out.println("thread2 end");

        }).start();

    }

}

1:循环体内无操作时,不会输出thread1 end

2:有输出操作时,会输出thread1 end

我的理解是finish没有加上volatile,线程的工作内存应该由JMM负责什么时候更新finish的值,while操作一直在读取finish的值,然而为什么一直没有更新。为什么加上输出操作又能更新到主内存的值?

128
Pack
Pack

System.out.println(finish)这个方法内部会调用synchronized,这个能解释为啥加了就能停止;不加的时候一直在while循环,没有空闲时间从主内存更新值

请先 登录 后评论