深度理解volatile關鍵字

最輕量的同步機制編程

獲取被volatile修飾的變量的時候,每次都要從主內存中獲取安全

設置被volatile修飾的變量的時候,每次都要刷回主內存當中併發

當其餘線程調用的時候,會將本身線程當中保存的變量值置爲無效,而後從新重主內存獲取ide

在讀取和寫入到主內存的時候,不會進行加鎖,因此稱之爲最輕量的同步機制測試

volatile不是線程安全的,他只能保證變量的可見性,沒法保證其原子性,若是設置的時候採用運算方式,那麼將沒法保證線程安全spa

運算方式線程

public volatile int age = 200;

set age = age+20; // 沒法保證操做的原子性

這就是運算賦值(簡寫)

測試用例:code

package org.dance.day1.vola;

import org.dance.tools.SleepTools;

/**
 * volatile沒法保證操做的原子性
 * @author ZYGisComputer
 */
public class VolatileUnsafe {

    private static class VolatileVar implements Runnable{

        private volatile int a = 0;

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            a = a + 1;
            System.out.println(name + ":" + a);
            SleepTools.ms(100);
            a = a + 1;
            System.out.println(name + ":" + a);
        }
    }

    public static void main(String[] args) {
        VolatileVar volatileVar = new VolatileVar();
        Thread thread = new Thread(volatileVar);
        Thread thread1 = new Thread(volatileVar);
        Thread thread2 = new Thread(volatileVar);
        Thread thread3 = new Thread(volatileVar);
        thread.start();
        thread1.start();
        thread2.start();
        thread3.start();
    }

}

返回測試結果:blog

Thread-0:1
Thread-3:4
Thread-2:3
Thread-1:2
Thread-0:5
Thread-1:7
Thread-2:6
Thread-3:5

能夠看見volatile沒法保證操做的原子性內存

因此說volatile關鍵字適用於一個線程寫,多個線程讀的場景,由於他只能保證可見性,不能保證原子性

做者:彼岸舞

時間:2020\09\15

內容關於:併發編程

本文屬於做者原創,未經容許,禁止轉發

相關文章
相關標籤/搜索