java基礎理論學習筆記(2)——CAS底層原理?對UNSafe的理解?有什麼缺點?ABA問題?

CAS是指Compare And Swap比較並交換,是一種很重要的同步思想。如果主內存的值跟期望值一樣,那麼就進行修改,否則一直重試,直到一致爲止。CAS涉及內容如以下結構:

CAS底層:他的核心類是UNSAFE類,這個類是rt.jar中的com.misc.unsafe,裏面通過native實現對底層系統的訪問,所以是通過內存偏移量對操作系統直接讀取值,獲得主內存當前的值,用以比較。而且他拿到值,比較,如果一致就交換,這個過程是原子性的,因爲他是操作系統的原指令。不會中間被其他線程插入。

CAS缺點:

CAS實際上是一種自旋鎖,

  1. 一直循環,開銷比較大。
  2. 只能保證一個變量的原子操作,多個變量依然要加鎖。
  3. 引出了ABA問題

第一個缺點:其中unsafe的源碼中有個do-while,他不限制線程併發,不加鎖,會對線程裏面循環一直取值進行比較,直到一致,修改完成爲止,會造成循環時間長,開銷大。

ABA問題:

所謂ABA問題,就是比較並交換的循環,存在一個時間差,而這個時間差可能帶來意想不到的問題。比如線程T1將值從A改爲B,然後又從B改爲A。線程T2看到的就是A,但是卻不知道這個A發生了更改。儘管線程T2 CAS操作成功,但不代表就沒有問題。 有的需求,比如CAS,只注重頭和尾,只要首尾一致就接受。但是有的需求,還看重過程,中間不能發生任何修改,這就引出了AtomicReference原子引用。引用類是用來解決自定義的對象類型的原子問題。解決ABA是用AtomicStampedReference,利用加戳的方式stamp:這個類維護了一個“版本號”Stamp,在進行CAS操作的時候,不僅要比較當前值,還要比較版本號。只有兩者都相等,才執行更新操作。

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