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