java併發編程學習之cas(一)

cas原理

cas全稱Compare and swap,比較和交換的意思。原子操做,須要硬件的支持。
三個基本操做數:內存地址V,舊的預期值A,要修改的新值B。
舉個線程A想執行相加的例子。多線程

  1. 內存地址V有個值是1。
  2. 線程A把V的值放在A中。
  3. 線程A執行V+2,獲得的3爲B。
  4. 把A和V的值比較,若是不同,從新執行2的步驟。
  5. 若是同樣,把V的值替換爲B。

synchronized,volatile,cas

  • synchronized:獨佔鎖,會致使其餘全部須要鎖的線程掛起,等待持有鎖的線程釋放鎖。
  • volatile:可見性,不保證原子性。
  • cas:樂觀鎖,不適用鎖的狀況下實現多線程的變量同步。

缺點

  1. ABA問題:在上面例子中,若是V的值是1,被B線程變成2,再被A線程變成1,那麼對於A線程來講,仍是當作沒有變化。解決的辦法就是加版本號。
  2. 性能問題:在併發量較高的狀況下,若是一直不成功,會一直增長CPU的開銷。
  3. 只能保證一個共享變量的原子操做
相關文章
相關標籤/搜索