1. 程式人生 > 實用技巧 >鎖:synchronized優化(jdk6)

鎖:synchronized優化(jdk6)

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,所以執行緒不會陷入阻塞,這是效率提升的因素之一
  • 但如果競爭激烈,可以想到重試必然頻繁發生,反而效率會受影響