cas即compare and swap.cas的語義:我認為v的值應該為a,如果是,那麼將v的值改為b,否則不修改並告訴v的值實際為多少(記憶體值v,舊的預期值a,要修改的值b)是一種解決鎖機制帶來的問題方案.
例如有個int i = 5,兩個執行緒都將對i進行 i++操作;如圖中紅色和綠色兩個執行緒:
當紅色執行緒先搶到資源對i進行操作時,先匹配a的值為5,符合則進行i++操作。此時綠色執行緒開始搶到資源,發現a的值為5而i=6,與預期值不符合,則重新返回修正。
鎖分為悲觀鎖和樂觀鎖,但都是一種悲觀策略,會帶來諸多問題:如多個執行緒要等待共同的被占用資源,優先順序高的執行緒等待優先順序的執行緒,效能問題.
cas是一種樂觀策略.有三個值:v(記憶體值[原值]),e(期待值[攜帶的原值]),n(新值[基於舊值經過運算後的新值]).只有當e=v時,才進行操作,否則不操作或重新運算.
cas的運用:atomicinteger,jdk1.8後concurrenthashmap取消分段鎖,而採用cas演算法,當數目達到8個後用紅黑樹.
cas也存在問題:
1.aba問題,當記憶體值經過多次修改後,由原來的a變為b,最後再變為a.此過程原鍊錶或資料結構可能發現改變,解決方案:增加個版本號;
2.迴圈時間長開銷大:當v!=e時,cas演算法會不斷重新執行;不過jvm支援處理器pause指令時,效率會提高明顯.
CAS無鎖機制
1 與鎖相比,使用比較交換 下文簡稱cas 會使程式看起來更加複雜一些。但由於其非阻塞性,它對死鎖問題天生免疫,並且,執行緒間的相互影響也遠遠比基於鎖的方式要小。更為重要的是,使用無鎖的方式完全沒有鎖競爭帶來的系統開銷,也沒有執行緒間頻繁排程帶來的開銷,因此,它要比基於鎖的方式擁有更優越的效能。2 ...
樂觀鎖與悲觀鎖 及CAS無鎖演算法
樂觀鎖與悲觀鎖 獨佔鎖是一種悲觀鎖,synchronized就是一種獨佔鎖,它假設壞的情況,並且只有在確保其它執行緒不會造成干擾 的情況下執行,會導致其它所有需要鎖的執行緒掛起,等待持有鎖的執行緒釋放鎖。而另乙個更加有效的鎖就 是樂觀 鎖。所謂樂觀鎖就是,每次不加鎖而是假設沒有衝突而去完成某項操作,...
關於CAS無鎖操作
首先先從鎖開始說起,鎖在作業系統中是很重要的一部分,它可以保證程式在多執行緒的環境下安全進行,它通過對乙個執行緒進行加鎖,當乙個執行緒加鎖之後,其餘的執行緒都要先掛起,放到後備佇列裡,直到這個程序釋放鎖之後,這也就是常說的悲觀鎖 還有一種鎖叫樂觀鎖,顧名思義,它是通過另外一種方式來實現這種互斥而不是...