java CAS(無鎖 樂觀鎖 輕量級鎖)

簡述

解釋

CAS由於是無鎖操作,因此不可能出現死鎖情況。CAS是非阻塞算法的一種常見實現。CAS是一條CPU的原子指令,不會造成所謂的數據不一致問題。
CAS 有效地說明了“ 我認爲位置 V 應該包含值 A;如果包含該值,則將 B 放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可"
CAS由於是在硬件層面保證的原子性,不會鎖住當前線程,它的效率是很高的。
CAS的關鍵點在於,系統在硬件層面保證了比較並交換操作的原子性,處理器使用基於對緩存加鎖或總線枷鎖的方式來實現多處理器之間的原子操作。

總結

詳情

CAS 存在三個問題

ABA問題

比如一個線程one從內存位置V中取出A,這是另一個線程two也從內存中取出A,並且two進行了一些操作變成了B,然後two又將V位置的數據變成A,這時候線程one進行CAS操作發現內存中仍然是A,然後one操作成功。儘管線程one的CAS操作成功,但是不代表這個過程就是沒有問題的。
部分樂觀鎖的實現是通過版本號(version)的方式來解決ABA問題
從Java1.5開始JDK的atomic包裏提供了一個類AtomicStampedReference來解決ABA問題。這個類的compareAndSet方法作用是首先檢查當前引用是否等於預期引用,並且當前標誌是否等於預期標誌,如果全部相等,則以原子方式將該引用和該標誌的值設置爲給定的更新值。

循環時間長開銷大

自選CAS如果長時間不成功,會給CPU帶來非常大的執行開銷。因此CAS不適合競爭十分頻繁的場景

只能保證一個共享變量的原子操作

當對一個共享變量執行操作時,我們可以使用循環CAS的方式來保證原子操作,但是對多個共享變量操作時,循環CAS就無法保證操作的原子性,這個時候就可以用鎖。

參考

CAS(比較並交換)
java cas算法實現樂觀鎖 (Compare and Swap 比較並交換)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章