CAS機制總結

  • cas機制
  • cas和synchronized 區別,場景,有缺點
  • cas底層實現、ABA問題場景、解決辦法

場景:公共內存值v=10,線程a,b分別對10進行5次++操做,最後結果20。
問題若是不加鎖,a獲得內存值10在進行++操做時,b也得到內存值10進行++操做。
此時就會出現結果<20的狀況。java

1、

cas機制:compare and swap(比較和替換)

cas三個操做數:V(內存值) A(舊的預期值) B(新值)

cas的使用場景:juc下lock、atomic操做
cas樂觀鎖(循環內自旋),原理:A=得到內存值,B=對A進行累加操做後的值。更新內存值V爲B的時候先將V和A對比,
若是相等,那麼V替換B退出循環,若是不相等,從新得到內存值,進行操做。
此套流程如何保證內存值是最新的?詳見volatile原理
此套流程如何保證V,A比較B替換V時是原子操做?cas底層用unsafe直接訪問底層操做系統,作了硬件級別的原子操做。多線程

2、

synchronized:悲觀鎖,當synchronized鎖住後,其它線程處於blocking狀態,當其他線程得到鎖後,
會進入runnable狀態,這個過程當中涉及到操做系統用戶模式和內核模式的轉換,代價比較高。
併發量很高的話,synchronized仍是比較適合的。併發

3、

cas優勢:如一描述在併發量不是很高時cas機制會提升效率。
cas缺點:
一、cpu開銷大,在高併發下,許多線程,更新一變量,屢次更新不成功,循環反覆,給cpu帶來大量壓力。
二、只是一個變量的原子性操做,不能保證代碼塊的原子性。
三、ABA問題高併發

4、

aba問題:內存值V=100;
threadA 將100,改成50;
threadB 將100,改成50;
threadC 將50,改成100;atom

場景:小牛取款,因爲機器不太好使,多點了幾回全款操做。後臺threadA和threadB工做,
此時threadA操做成功(100->50),threadB阻塞。正好牛媽打款50元給小牛(50->100),
threadC執行成功,以後threadB運行了,又改成(100->50)。
牛氣沖天,lz錢哪去了???操作系統

如何解決aba問題:
對內存中的值加個版本號,在比較的時候除了比較值還的比較版本號。線程

java:AtomicStampedReference就是用版本號實現cas機制。內存

相關文章
相關標籤/搜索