无心流泪 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是表示变量在使用时直接去共享内存中获取,而不是从当前线程的私有内存区域存取。通常在线程开启时,会将使用到的变量产生一个线程内的副本,与主线程内存中的数据不同步。

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab求解平差
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法