一个关于多线程不可见性与While语句是非为空的问题?

static boolean flag = false;
    public static void main(String[] args) {

        new Thread(new read(){
            @Override
            public void run() {
                while (!flag){
                System.out.println("你能看见我吗?");
                }
//                System.out.println(flag);
            }
        }).start();
        TreadUtils.sleep(2000);//先睡眠主线程一会
//        System.out.println(flag);
        flag= true;
    }

从上面代码,while判断为真值,flag拿到缓冲区的值为false,判断出为true,理论上死循环退出不了。但实际上最后会结束进程。

结果如上图,线程最后获取到了true值。
下面改动一点点,代码如下:

    static boolean flag = false;
    public static void main(String[] args) {

        new Thread(new read(){
            @Override
            public void run() {
                while (!flag){}//改这里,让他不包裹打印语句,变成空语句
                System.out.println("你能看见我吗?");
//                System.out.println(flag);
            }
        }).start();
        TreadUtils.sleep(2000);//先睡眠主线程一会
//        System.out.println(flag);
        flag= true;
    }

然后线程就会一直循环,结束不了。
结果如图:

那么问题来了,根据多线程的不可见性,那么应该出现下面这种一直循环,一直打印输出的才对。为什么有个输出语句就能获取到主线程后面被改的值而结束循环,但空语句就不行???:sob:

讨论数量: 2

应该是有输出 io 的时候,进行了线程的中断和切换,没有 io 的时候就一直在主线程中(真·死循环)

1个月前 评论

System.out.println()中有synchronized存在,synchronized也能解决可见性问题。

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!