双线程循环输出问题,

package com.example.xmzjcqgl.test;


public class test {
   static Boolean  c=true;
    static Integer  count=0;
    public static void main(String[] args) {
        new Thread(()->{
            while (true){
             //   System.out.println("000000000"+"1111"+c);
                while (c){
                    c=false;
                    System.out.println("1111"+c+":"+count++);

                }
            }
        }).start();
        new Thread(()->{
            while (true){
                //System.out.println("000000000"+"2222"+c);
                while (!c){
                    c=true;
                    System.out.println("2222"+c+":"+count++);

                }
            }
        }).start();

    }

}

问题 为什么把 while (true){里面的输出放开while (c){就可以无限执行 屏蔽掉while (c){执行一会就不输出了 但是程序还没停

首先,程序没有停止,是因为外层 while(true) 是死循环。
多线程同时操作一个变量 c 是存在可见性问题的,如果没有及时看到写入后的 c 的值,就可能出现 while(c) 不执行的情况。

因为当线程获取、释放锁的时候会把对应的本地内存中的共享变量刷新到主内存中
在println中会获取、释放锁,会不停的刷新变量C
其实就相当于你加了Volatile了

另外这声望还可以负的吗