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

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

    评论

报告相同问题?