最輕量的同步機制編程
獲取被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
內容關於:併發編程
本文屬於做者原創,未經容許,禁止轉發