Java關鍵字volatile修飾變數
阿新 • • 發佈:2019-01-27
volatile關鍵字的作用是告訴編譯器,凡是被該關鍵字申明的變數都是易變的、不穩定的,所以不要試圖對該變數使用快取等優化機制,而應當每次都從他的記憶體地址中去讀取值,但volatile並不是每次更改完就要立刻將他寫回記憶體,volatile只提供了記憶體的可見性,並不提供原子性(與鎖機制的區別:鎖機制即提供了記憶體的可見性又提供了原子性)。
使用volatile標記的變數在讀取或寫入時不需要使用鎖,這將減少產生死鎖的概率。
原子操作:atomic
atomic是不會阻塞執行緒,執行緒安全的加強版的volatile原子操作。
以其中的AtomicInteger來說明:
AtomicInteger主要的方法有:
get() 獲取當前值。
getAndSet(int newValue) 以原子方式設定為給定值,並返回舊值。
getAndDecrement() 以原子方式將當前值減 1。
getAndIncrement() 以原子方式將當前值加 1。
getAndAdd(int delta) 以原子方式將給定值與當前值相加。
public class AtomicIntegerDemo {
public static void main(String[] args) {
AtomicInteger atomicInteger=new AtomicInteger();
System.out.println(atomicInteger.get());
System.out.println(atomicInteger.getAndSet(1));
System.out.println(atomicInteger.getAndSet(2));
System.out .println(atomicInteger.getAndIncrement());
System.out.println(atomicInteger.getAndDecrement());
System.out.println(atomicInteger.getAndAdd(5));
System.out.println(atomicInteger.get());
}
}
原子操作的實現原理
是利用CPU進行交換比較(即CAS:Compare and Swap)和非阻塞式演算法(nonblocking algorithms);檢視AtomicInteger原始碼會發現有些是通過呼叫JNI的程式碼實現的。JNI(Java Native Interface)為JAVA的本地呼叫,允許java呼叫其它語言,而Compare and Swap就是藉助C來呼叫CPU底層指令實現的。