CAS(Compare and Swap)無鎖算法-學習筆記
阿新 • • 發佈:2018-07-19
syn evel 線程安全 上下文切換 原理 oss try 一次 和數
非阻塞同步算法與CAS(Compare and Swap)無鎖算法
這篇問題對java的CAS講的非常透徹!
鎖的代價
1. 內核態的鎖的時候需要操作系統進行一次上下文切換,加鎖、釋放鎖會導致比較多的上下文切換和調度延時,等待鎖的線程會被掛起直至鎖釋放。在上下文切換的時候,cpu之前緩存的指令和數據都將失效,對性能有很大的損失。
2. 用戶態的鎖雖然避免了這些問題,但是其實它們只是在沒有真實的競爭時才有效。
樂觀鎖與悲觀鎖
1. 獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,它假設最壞的情況,並且只有在確保其它線程不會造成幹擾的情況下執行,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖 2. 樂觀鎖就是,每次不加鎖而是假設沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。
volatile
1. volatile變量是一和更輕量級的同步機制,因為在使用這些變量時不會發生上下文切換和線程調度等操作,但是volatile變量也存在一些局限:不能用於構建原子的復合操作,因此當一個變量依賴舊值時就不能使用volatile變量。 2. volatile只能保證變量對各個線程的可見性,但不能保證原子性。 3. [談談volatile變量](http://www.cnblogs.com/lucifer1982/archive/2008/03/23/1116981.html) 4. [為什麽volatile不能保證原子性而Atomic可以?](http://www.cnblogs.com/Mainz/p/3556430.html) 5. [你應該知道的 volatile 關鍵字](https://github.com/crossoverJie/Java-Interview/blob/master/MD/concurrent/volatile.md)
CAS
1. CAS(比較與交換,Compare and swap)是一種有名的無鎖算法。CAS, CPU指令,在大多數處理器架構,包括IA32、Space中采用的都是CAS指令,CAS的語義是“我認為V的值應該為A,如果是,那麽將V的值更新為B,否則不修改並告訴V的值實際為多少”,CAS是項樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什麽都不做。
ConcurrentHashMap的實現原理
1. Java5中的ConcurrentHashMap,線程安全,設計巧妙,用桶粒度的鎖,避免了put和get中對整個map的鎖定,尤其在get中,只對一個HashEntry做鎖定操作,性能提升是顯而易見的。
2. [ConcurrentHashMap之實現細節](http://www.iteye.com/topic/344876)
3. [探索 ConcurrentHashMap 高並發性的實現機制](https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/)
高並發環境下優化鎖或無鎖(lock-free)的設計思路
1. 服務端編程的3大性能殺手:1、大量線程導致的線程切換開銷。2、鎖。3、非必要的內存拷貝。在
2. 並發環境下要實現高吞吐量和線程安全,兩個思路:一個是用優化的鎖實現,一個是lock-free的無鎖結構。
3. 優化鎖實現的例子:Java中的ConcurrentHashMap,設計巧妙,用桶粒度的鎖和鎖分離機制,避免了put和get中對整個map的鎖定,尤其在get中,只對一個HashEntry做鎖定操作,性能提升是顯而易見的(詳細分析見《探索 ConcurrentHashMap 高並發性的實現機制》)。Lock-free無鎖的例子:CAS(CPU的Compare-And-Swap指令)的利用和LMAX的disruptor無鎖消息隊列數據結構等。有興趣了解LMAX的disruptor無鎖消息隊列數據結構的可以移步slideshare。
CAS(Compare and Swap)無鎖算法-學習筆記