鎖、volatile和CAS的比較


一、鎖

鎖是一種悲觀的機制。為多線程提供了互斥的訪問機制。多個線程同時競爭鎖時,沒獲得鎖的線程將會被掛起(智能的JVM會根據之前獲取鎖操作中對鎖的持有時間長短來判斷是使線程掛起還是自旋)

鎖的劣勢:
1.未競爭到鎖的線程掛起后再恢復時,會進行上下文的切換,開銷大。
2.當一個線程正在等待鎖時,它不能干任何其它事情。
如果持有鎖的線程被延遲執行(例如發生了缺頁錯誤、調度延遲、或者其它類似情況),那么所有需要該鎖的線程都必須等待下去。
如果被阻塞線程的優先級較高,而持有鎖的線程優先級較低,那么這將是一個嚴重的問題——優先級反轉。即使高優先級的線程可以搶先執行,但仍然需要等待鎖被釋放,從而導致它的優先級會降至低優先級線程的級別。
如果持有鎖的線程被永久阻塞(例如由於出現無限循環,死鎖,活鎖或者其他的活躍性障礙),所有等待這個鎖的線程就永遠無法執行下去。

二、volatile

與鎖相比,volatile是一種更輕量級的同步機制。
volatile的優勢:在使用這些變量時,不會發生上下文切換和線程調度等操作。
volatile的局限:不能保證復合操作的原子性。例如i++,並不能通過volatile來保證原子性。

三、CAS

對於細粒度操作,除了volatile提供的輕量級的同步機制,還有另外一種更高效的樂觀方法。
在針對多處理器操作而設計的處理器中提供了一些特殊指令,用於管理對共享數據的並發訪問。
現在,幾乎所有的現代處理器中都包含了某種形式的原子讀-改-寫指令,例如比較並交換(compare and swap)、關聯加載/條件存儲(load linked/store conditional)。操作系統和JVM使用這些指令來實現鎖和並發的數據結構。

四、鎖與原子變量的比較  以及 非阻塞算法 

請參考《Java並發編程實戰》第15章

 

總結

1.鎖的優缺點?

2.volatile的優缺點?

3.什么是CAS?其原理、優勢?

4.JVM如何支持CAS的?

5.什么是ABA問題?如果解決?

 

參考資料:《Java並發編程實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM