場景:公共記憶體值v=10,執行緒a,b分別對10進行5次++操作,最後結果20。
問題如果不加鎖,a得到記憶體值10在進行++操作時,b也獲得記憶體值10進行++操作。
此時就會出現結果<20的情況。
一、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直接訪問底層作業系統,做了硬體級別的原子操作。
二、synchronized:悲觀鎖,當synchronized鎖住後,其它執行緒處於blocking狀態,當其餘執行緒獲得鎖後,
會進入runnable狀態,這個過程中涉及到作業系統使用者模式和核心模式的轉換,代價比較高。
併發量很高的話,synchronized還是比較適合的。
三、cas優點:如一描述在併發量不是很高時cas機制會提高效率。
cas缺點:
1、cpu開銷大,在高併發下,許多執行緒,更新一變數,多次更新不成功,迴圈反覆,給cpu帶來大量壓力。
2、只是乙個變數的原子性操作,不能保證**塊的原子性。
3、aba問題
四、aba問題:記憶體值v=100;
threada 將100,改為50;
threadb 將100,改為50;
threadc 將50,改為100;
場景:小牛取款,由於機器不太好使,多點了幾次全款操作。後台threada和threadb工作,
此時threada操作成功(100->50),threadb阻塞。正好牛媽打款50元給小牛(50->100),
threadc執行成功,之後threadb執行了,又改為(100->50)。
牛氣沖天,lz錢哪去了???
如何解決aba問題:
對記憶體中的值加個版本號,在比較的時候除了比較值還的比較版本號。
j**a:atomicstampedreference就是用版本號實現cas機制。
cas認證機制
1 什麼事cas?cas是central authentication service的縮寫,認證服務,一種獨立開放指令協議。cas 是 yale 大學發起的乙個開源專案,旨在為 web 應用系統提供一種可靠的單點登入方法。cas 包含兩個部分 cas server 和 cas client。cas...
什麼是CAS機制
參考 cas是英文單詞compare and swap的縮寫,翻譯過來就是比較並替換。更新乙個變數的時候,只有當變數的預期值a和記憶體位址v當中的實際值相同時,才會將記憶體位址v對應的值修改為b。這樣說或許有些抽象,我們來看乙個例子 cas的缺點 1.cpu開銷較大 在併發量比較高的情況下,如果許多...
CAS無鎖機制
1 與鎖相比,使用比較交換 下文簡稱cas 會使程式看起來更加複雜一些。但由於其非阻塞性,它對死鎖問題天生免疫,並且,執行緒間的相互影響也遠遠比基於鎖的方式要小。更為重要的是,使用無鎖的方式完全沒有鎖競爭帶來的系統開銷,也沒有執行緒間頻繁排程帶來的開銷,因此,它要比基於鎖的方式擁有更優越的效能。2 ...