无心流泪 2018-07-15 07:25 采纳率: 50%
浏览 3343
已结题

Java中的static变量难道不能保证volatile的可见性吗?

 //在没有同步的情况下共享数据
public class NoVisibility {
    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread {
        public void run() {
            while (!ready)
               Thread.yield();
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        new ReaderThread().start();
        number = 42;
        ready = true;
   }
}

引发的问题有

NoVisibility 可能会持续循环下去,因为ReaderThread可能永远看不到ready写入的值
NoVisibility 可能会输出0,因为ReaderThread可能看到了ready写入的值,但是没有看到写入的number的值(这种现象叫重排序)


但是在我们使用static变量的时候,比如HashMap作为static变量的时候,我们根本没有担心过可见性的问题啊,修改后的HashMap我们总是认为是可见的对其他线程

  • 写回答

7条回答

  • zwx19925319 2018-07-15 08:03
    关注

    static只是表示这个变量是该类所有实例共享的。volatile是表示变量在使用时直接去共享内存中获取,而不是从当前线程的私有内存区域存取。通常在线程开启时,会将使用到的变量产生一个线程内的副本,与主线程内存中的数据不同步。

    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?