鎖:synchronized優化(jdk6)
阿新 • • 發佈:2020-08-22
1、CAS原理
(1)CAS:(https://www.cnblogs.com/zhai1997/p/13467606.html)
2、CAS和volatile實現無鎖併發
public class Test { public static void main(String[] args) throws InterruptedException { AtomicInteger atomicInteger = new AtomicInteger(); Runnable mr = () -> { for (int i = 0; i < 1000; i++) { atomicInteger.incrementAndGet(); } }; ArrayList<Thread> ts = new ArrayList<>(); for (int i = 0; i < 5; i++) { Thread t = new Thread(mr); t.start(); ts.add(t); } for (Thread t : ts) { t.join(); } System.out.println("number = " + atomicInteger.get()); } }
AtomicInteger的原始碼中包括Unsafe類,Unsafe類提供了原子操作
3、Unsafe類
Unsafe類使Java擁有了像C語言的指標一樣操作記憶體空間的能力,同時也帶來了指標的問題。過度的使用Unsafe類會使得出錯的機率變大,因此Java官方並不建議使用的,官方文件也幾乎沒有。Unsafe物件不能直接呼叫,只能通過反射獲得。
CAS的這種機制我們稱之為樂觀鎖,綜合性能較好
CAS獲取共享變數時,為了保證該變數的可見性,需要使用volatile修飾。結合CAS和volatile可以實現無鎖併發,適用於競爭不激烈、多核 CPU 的場景下。
- 因為沒有使用 synchronized,所以執行緒不會陷入阻塞,這是效率提升的因素之一
- 但如果競爭激烈,可以想到重試必然頻繁發生,反而效率會受影響