线程安全性(三)

2018-06-02  本文已影响0人  墨平语凡

可见性

不可见的原因.jpg synchronized.png image.png

volatile变量在每次被线程访问时都强迫从主内中读取该变量的值,而该变量发生变化时都会强迫线程将该变量的值刷新到主内存中,这样,任何时候所有线程都能看到该变量的最新值

volatile写.png volatile读.png
 /**
     *  当两个线程同时执行了第一步, 就都读到了count的值, 比如是5
     *  两个线程同时执行了+1操作并写回主存,这样就丢了一次+1的操作,结果是6问不是5
     */
    public static void add(){
        // 1. 去读内存中的count值
        // 2. +1
        // 3. count写回主存
        count++;
    }

volatile 不具有原子性

使用volatile需要具备两个条件:

  1. 对变量的写操作不依赖于当前值
  2. 该变量没有包含在具有其他变量的不变的式子中,因此volatile特别适合作为状态标记量。
    boolean.png
上一篇 下一篇

猜你喜欢

热点阅读