你这是在为难我胖虎 2021-12-11 15:14 采纳率: 0%
浏览 14

不加volatile,线程不可见的问题,与理论的结果有出入?

下面这段代码是比较常见的证明线程之间不可见的例子,但是我想问的是如果将 Thread.sleep(2000);这段代码去了,为什么第一个线程的死循环就能够跳出,线程之间不是不可见的吗?
我猜测的两种答案:
1.后一个线程先执行结束了,initFlag的共享变量副本进入主内存了,第一个线程再执行。但是我将步骤打印出来,结果并不是这样。
2.之前查阅了其他博客,说是System.out.println内置同步锁,触发了缓存一致性协议!
于是乎,我有将System.out.println换成logeer,但是还是没有出现理论上线程之间不可见的答案。这两种推论都不成立。

头发都急白了,help!help!谁能够说明白,为什么将Thread.sleep(2000)去了,没有加volatile,但是线程之间还是可见了?

 /**
 * 线程之间是不可见的
 */
public class VolatileVisibilityTest {
    private static boolean initFlag  =false;
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            System.out.println("waiting.....data");
            while (!initFlag){

            }
            System.out.println("wait....data....end");
        }).start();

     //   Thread.sleep(2000);

        new Thread(()->predData()).start();
    }

    public static void predData(){
        System.out.println("pred....data");
        initFlag = true;
        System.out.println("pred....data....end");
    }
}


运行结果及报错内容

img

  • 写回答

1条回答 默认 最新

  • 未聞花名丶 2021-12-11 16:26
    关注

    我理解静态变量是属于类的,你的两个线程共享着这个变量,如果后一个线程先执行了更新,那么前一个线程永远不会跳出来,加了sleep
    保证了第一个线程先执行

    评论

报告相同问题?

问题事件

  • 创建了问题 12月11日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析