CAS和AQS


1 CAS

什么是CAS?

  CAS(Compare And Swap),即比較並交換。是解決多線程並行情況下使用鎖造成性能損耗的一種機制,CAS操作包含三個操 作數——內存位置(V)、預期原值(A)和新值(B)。如果內存位置的值與預期原值相匹配,那么處理器會自動將該位置值更新 為新值。否則,處理器不做任何操作。無論哪種情況,它都會在CAS指令之前返回該位置的值。CAS有效地說明了“我認為位 置V應該包含值A;如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。

  CAS
    1、概念
      CompareAndSet  CompareAndSwap:一種無鎖的原子操作,樂觀鎖思想:給你一個期望值,與你現在的值相比,如果相等再修改,不相等什么事情都不做CAS(V, E, N)
 
    2、作用及優點
      CAS實現稍微有點復雜,無鎖,不存在阻塞,提高了效率、CPU的吞吐量,性能好
 
    3、缺點
      無法察覺過程中是否有變化
 
    4、改進
      AtomicStampedReference:增加了時間戳
 
    5、CAS應用的場景
    •   應用於簡單的數據計算
    •   線程沖突少的場景

如在多線程中實現自增,會出現線程安全問題,要解決這個問題,需要通過加鎖的方式,調整如下:

public class Counter {
    private int count;
    public Counter(){}
    public synchronized int getCount(){
        return count;
    }
    public synchronized void increase(){
        count++;
    }
}
這類似於悲觀鎖的實現,我需要獲取這個資源,那么我就給他加鎖,別的線程都無法訪問該資源,直到我操作完后釋放對該資源的鎖。我們知道,悲觀鎖的效率是不如樂觀鎖的,上面說了Atomic下的原子類的實現是類似樂觀鎖的,效率會比使用 synchronized 關系字高,推薦使用這種方式,實現如下:

public class Counter {
    private AtomicInteger count = new AtomicInteger();
    public Counter(){}
    public int getCount(){
        return count.get();
    }
    public void increase(){
        count.getAndIncrement();
    }
}

2 AQS

AQS(AbstractQueuedSynchronizer),AQS是JDK下提供的一套用於實現基於FIFO等待隊列的阻塞鎖和相關的同步器的一個同步框架。這個抽象類被設計為作為一些可用原子int值來表示狀態的同步器的基類。如果你有看過類似 CountDownLatch 類的源碼實現,會發現其內部有一個繼承了 AbstractQueuedSynchronizer 的內部類 Sync 。可見 CountDownLatch 是基於AQS框架來實現的一個同步器.類似的同步器在JUC下還有不少。(eg.Semaphore )

 

  AQS
    1、概念:
      AbstractQueuedSynchronizer:同步發生器,用於構建鎖
    2、基本思想
      通過內置的FIFO同步隊列來完成線程爭奪資源的管理工作
    3、CLH同步隊列 
      同步發生器內部維護了隊列,隊列的每個節點都是一個線程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM