Java併發之CAS與AQS簡介

 

1,什麼是CAS

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

在JAVA中,sun.misc.Unsafe 類提供了硬件級別的原子操做來實現這個CAS。 java.util.concurrent 包下的大量類都使用了這個 Unsafe.java 類的CAS操做。至於 Unsafe.java 的具體實現這裏就不討論了。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.htmlatom

https://blog.csdn.net/holmofy/article/details/73824757spa

https://blog.csdn.net/zcw4237256/article/details/78552741

相關文章
相關標籤/搜索