CAS

CAS 比較並交換 CompareAndSwapjava

比較當前工做內存中的值和主內存中值,若是相同則執行規定操做,不然積蓄比較直到主內存和工做內存中的值一致爲止。若是CCAS失敗,會一直進行嘗試。若是CAS長時間一致不成功,可能會給CPU帶來很大的開銷。算法

CAS操做包含三個操做數:內存位置(V)、預期原值(A)、新值(B),若是內存位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新爲新增。多線程

CAS的目的:利用CPU的CAS指令,同時藉助JNI來完成java的非阻塞算法。操作系統

CAS存在的問題:雖然很高效的解決了原子操做,可是存在三大問題;線程

(1)     ABA問題;內存

(2)     循環時間長開銷大資源

(3)     只能保證一個共享變量的原子操做變量

Unsafe是CAS的核心類,因爲java方法沒法直接訪問底層系統,須要經過本地(native)方法來訪問,Unsafe至關於一個後門,基於該類能夠直接操做特定的內存的數據。循環

Unsafe類中的全部方法都是native修飾的,也就是說Unsafe類中的方法都直接調用操做系統底層資源執行相應任務。引用

變量valueOffset,表示該變量值在內存中的偏移地址,由於Unsafe就是根據內存偏移地址獲取數據的。

變量value用volatile修飾,保證了多線程之間的內存可見性。

解決ABA問題  AtomicReference原子引用

相關文章
相關標籤/搜索