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原子引用