Synchronized 與 ReentrantLock 的區別!

做者:jason
cnblogs.com/baizhanshi/p/7211802.html

以前棧長分享了重入鎖的概念:《到底什麼是重入鎖,拜託,一次搞清楚!》,今天現來深刻了解下 Synchronized 與 ReentrantLock 的區別!html

可重入性:java

從名字上理解,ReenTrantLock的字面意思就是再進入的鎖,其實synchronized關鍵字所使用的鎖也是可重入的,二者關於這個的區別不大。面試

二者都是同一個線程沒進入一次,鎖的計數器都自增1,因此要等到鎖的計數器降低爲0時才能釋放鎖。後端

鎖的實現:微信

Synchronized是依賴於JVM實現的,而ReenTrantLock是JDK實現的,有什麼區別,說白了就相似於操做系統來控制實現和用戶本身敲代碼實現的區別。前者的實現是比較難見到的,後者有直接的源碼可供閱讀。多線程

性能的區別:架構

在Synchronized優化之前,synchronized的性能是比ReenTrantLock差不少的,可是自從Synchronized引入了偏向鎖,輕量級鎖(自旋鎖)後,二者的性能就差很少了。工具

在兩種方法均可用的狀況下,官方甚至建議使用synchronized,其實synchronized的優化我感受就借鑑了ReenTrantLock中的CAS技術。都是試圖在用戶態就把加鎖問題解決,避免進入內核態的線程阻塞。源碼分析

功能區別:性能

便利性:很明顯Synchronized的使用比較方便簡潔,而且由編譯器去保證鎖的加鎖和釋放,而ReenTrantLock須要手工聲明來加鎖和釋放鎖,爲了不忘記手工釋放鎖形成死鎖,因此最好在finally中聲明釋放鎖。

鎖的細粒度和靈活度:很明顯ReenTrantLock優於Synchronized

ReenTrantLock獨有的能力:

1.ReenTrantLock能夠指定是公平鎖仍是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的線程先得到鎖。

2.ReenTrantLock提供了一個Condition(條件)類,用來實現分組喚醒須要喚醒的線程們,而不是像synchronized要麼隨機喚醒一個線程要麼喚醒所有線程。

3.ReenTrantLock提供了一種可以中斷等待鎖的線程的機制,經過lock.lockInterruptibly()來實現這個機制。

ReenTrantLock實現的原理:

在網上看到相關的源碼分析,原本這塊應該是本文的核心,可是感受比較複雜就不一一詳解了,簡單來講,ReenTrantLock的實現是一種自旋鎖,經過循環調用CAS操做來實現加鎖。

它的性能比較好也是由於避免了使線程進入內核態的阻塞狀態。想盡辦法避免線程進入內核的阻塞狀態是咱們去分析和理解鎖設計的關鍵鑰匙。

什麼狀況下使用ReenTrantLock:

答案是,若是你須要實現ReenTrantLock的三個獨有功能時。

最後,你們也能夠關注微信公衆號:Java技術棧,棧長將繼續分享更多 Java 系列乾貨,在公衆號後臺回覆:Java,能夠獲取棧長已經整理好的歷史 Java 系列乾貨文章。

推薦去個人博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿里巴巴等大廠最新面試題

以爲不錯,別忘了點贊+轉發哦!

相關文章
相關標籤/搜索