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
https://blog.csdn.net/holmofy/article/details/73824757
https://blog.csdn.net/zcw4237256/article/details/78552741