【多线程】:Synchronized和ReentrantLock的对比
相同點:
兩者都是可重入鎖,同一個線程每進入一次,鎖的計數器都自增1,等到鎖的計數器下降為0時才能釋放鎖。
?
底層實現對比:
Synchronized是依賴于JVM實現的,而ReentrantLock是JDK實現的。
?
性能對比:
Synchronized優化以前,性能比ReenTrantLock差很多,但是自從Synchronized引入了偏向鎖,輕量級鎖(自旋鎖)后,兩者的性能就差不多了。
在兩種方法都可用的情況下,官方甚至建議使用synchronized。
Synchronized的優化借鑒了ReentrantLock中的CAS技術。都是試圖在用戶態就把加鎖問題解決,避免進入內核態的線程阻塞。
?
使用便利性對比:
Synchronized的使用比較方便簡潔,并且由編譯器去保證鎖的加鎖和釋放;
而ReentrantLock需要手工聲明來加鎖和釋放鎖,為了避免忘記手工釋放鎖造成死鎖,所以最好在finally中聲明釋放鎖。
?
ReenTrantLock獨有的能力:
1. ReentrantLock可以指定是公平鎖還是非公平鎖。而Synchronized只能是非公平鎖。PS:公平鎖就是先等待的線程先獲得鎖。
2. ReentrantLock提供了一個Condition類,用來實現分組喚醒需要喚醒的線程們,而Synchronized只能隨機喚醒一個線程,或者喚醒全部線程。
3. ReentrantLock提供了一種能夠中斷等待鎖的線程的機制,通過lock.lockInterruptibly()來實現這個機制。
總結:
ReentrantLock比Synchronized鎖控制粒度更細,更底層,更靈活,但使用不當或不熟悉出錯可能性更高些。所以個人覺得如果涉及上述3種特殊訴求,使用ReentrantLock,否則直接使用Synchronized更方便快捷,且不容易出錯。
?
轉載于:https://www.cnblogs.com/wwcom123/p/10023168.html
總結
以上是生活随笔為你收集整理的【多线程】:Synchronized和ReentrantLock的对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9-18 学习如何使用Python包的管
- 下一篇: 61二叉搜索树的第k个结点