用法 volatile string = "a";
線程寫volatile變量的過程:
1.改變線程本地內存中volatile變量副本的值
2.將改變后的副本的值從本地內存刷新到主內存
線程讀volatile變量的過程:
1.從主內存中讀取volatile變量的最新值到線程的本地內存中
2.從本地內存中讀取volatile變量的副本
volatile實現內存可見性原理:
寫操作時,通過在寫操作指令后加入一條store屏障指令,讓本地內存中變量的值能夠刷新到主內存中
讀操作時,通過在讀操作前加入一條load屏障指令,及時讀取到變量在主內存的值
內存屏障是一種cpu的指令,用於控制特定條件下的重排序和內存可見性問題,
java編譯器也會根據內存屏障的規則禁止重排序
volatile 只能保證可見性和有序性,並不能保證原子性
所以它替代不了同步代碼塊。
* AtomicInteger(原子操作)
用法:public volatile AtomicInteger count = new AtomicInteger(0);