Java並發之CAS與AQS簡介

來源:互聯網
上載者:User

標籤:aqs   logs   fifo   分享圖片   源碼實現   nbsp   情況   等待隊列   講解   

 

1,什麼是CAS

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

在JAVA中,sun.misc.Unsafe 類提供了硬體層級的原子操作來實現這個CAS。 java.util.concurrent 包下的大量類都使用了這個 Unsafe.java 類的CAS操作。至於 Unsafe.java 的具體實現這裡就不討論了。

CAS典型應用

java.util.concurrent.atomic 包下的類大多是使用CAS操作來實現的(eg. AtomicInteger.java,AtomicBoolean,AtomicLong)。下面以 AtomicInteger.java 的部分實現來大致講解下這些原子類的實現。

 

2,AQS( AbstractQueuedSynchronizer)什麼是AQS

fifo隊列 + 原子int(表示狀態)

原子int:AtomicInteger這個類的存在是為了滿足在高並發的情況下,原生的整形數值自增線程不安全的問題;

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

AQS用法

如上所述,AQS管理一個關於狀態資訊的單一整數,該整數可以表現任何狀態。比如, Semaphore 用它來表現剩餘的許可數,ReentrantLock 用它來表現擁有它的線程已經請求了多少次鎖;FutureTask 用它來表現任務的狀態(尚未開始、運行、完成和取消)。

詳情見:

https://www.cnblogs.com/waterystone/p/4920797.html

73824757

78552741

 

Java並發之CAS與AQS簡介

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.