1. 程式人生 > >java中你所不知道的CAS操作

java中你所不知道的CAS操作

sta mar 一個 swap 不知道 通過 樂觀 變換 沒有

1.CAS是什麽
  Compare and Swap(比較並操作),由處理器架構支持,語義是如果當前值V和舊值A相同,則將當前值修改為B,如果不相同則不修改。CAS操作采用的是樂觀鎖技術,當多線程同時修改某個變量時只有一個成功,其他線程會失敗當是不會被掛起,會被告知失敗並重試。
2.CAS操作和synchronized有什麽區別呢
  synchronized關鍵字采用悲觀鎖技術,線程獨享鎖,其他線程會被掛起知道鎖被釋放線程恢復,掛起和恢復會有很大的開銷。
3.java中CAS操作有哪些
  java1.5之後引入了對CAS操作的底層支持,比如在intel的CPU中使用的是cmpxchg指令。java.util.concurrent.atomic中的AtomicXXX都使用了CAS操作,比如AtomicInteger的getAndIncrement方法來實現i++的原子的復合操作。舉例說明實現一個無鎖數據結構(非阻塞算法):
  實現一個單鏈表棧,棧頂A,A.next為B,需要將A出棧。兩個線程同時操作head.compareAndSwap(A,B),線程T1比較棧頂的當前值和舊值均為A則將A改為B,線程T2看到棧頂的當前值為B和舊值A不同則什麽都不做。這就實現了無鎖的堆棧。
4.ABA問題的解決方案
  無鎖的數據結構中存在一個ABA的問題,如果線程T1經過一系列的操作後將棧變為A->C->D,那麽T2經過比較後仍然會將棧變為B,會將C和D丟失掉。
  解決ABA問題的某些算法中會記錄數據變換的過程,可以通過一個版本號來記錄,A變成B再變成A和沒有任何操作是的版本號是不同的。
  java中AtomicStampedReference和AtomicMarkableReference實現了解決ABA的問題。AtomicStampedReference會使用一個Pair來保存引用和計數器。每次操作前不但會比較引用值還會比較計數器值,完成操作後會更新計數器的值。AtomicMarkableReference使用Pair來保存引用和布爾類型的標記值。AtomicStampedReference可查看引用的改變次數,AtomicMarkableReference只關心有沒改變

java中你所不知道的CAS操作