关于可见性的问题,谢谢老师!

来源:3-4 线程安全性-可见性

慕神2874530

2019-04-10

老师,您好!我写了一个简单的程序测试可见性的这个东西,发现一个问题。
如下代码:大体流程就是,say方法中,while循环的跳出条件是closed==true,初始值为false。另外一个线程3秒后将其设置为true:

static class Test {
        private boolean closed = false;

        public static void main(String[] args) {
            Test t = new Test();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000L);
                    } catch (Exception e) {

                    }
                    System.out.println("设置关闭");
                    t.close();
                }
            }).start();
            t.say();
        }

        public void close() {
            closed = true;
        }

        public void say() {
            while (!closed) {
                //System.out.println("say...");
            }
            System.out.println("closed");
        }
    }

现在的现象是,现在closed变量没有加volatile修饰,while循环体中如果没有代码,其它线程将closed修改为true之后,while循环是不会终止的,但是如果有代码(比如我上面加注释的输出),循环就会终止,这个是什么原因啊?难道循环体中有代码执行的时候,下次循环会从主存中读取新的closed的值,如果没有代码,就不会从主存读取新值吗?这个和volatile还没有关系,如果使用volatile修饰肯定没有问题。谢谢老师解答!!

写回答

2回答

慕神2874530

提问者

2019-04-10

老师,我好像知道了,System.out.println
方法里有synchronized修饰的代码块儿。。。。。。

0
0

慕神2874530

提问者

2019-04-10

突然想起,和happened-before有关系吗?

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程