更新時間:2020-12-08 來源:黑馬程序員 瀏覽量:
ReentrantLock是Lock的實現(xiàn)類,是一個互斥的同步鎖。從功能角度,ReentrantLock比Synchronized的同步操作更精細(xì)(因為可以像普通對象一樣使用),甚至實現(xiàn)Synchronized沒有的高級功能,如:
·等待可中斷:當(dāng)持有鎖的線程長期不釋放鎖的時候,正在等待的線程可以選擇放棄等待,對處理執(zhí)行時間非常長的同步塊很有用。
·帶超時的獲取鎖嘗試:在指定的時間范圍內(nèi)獲取鎖,如果時間到了仍然無法獲取則返回。
·可以判斷是否有線程在排隊等待獲取鎖可以響應(yīng)中斷請求與Synchronized不同,當(dāng)獲取到鎖的線程被中斷時,能夠響應(yīng)中斷,中斷異常將會被拋出,同時鎖會被釋放。
·可以實現(xiàn)公平鎖。
從鎖釋放角度, Synchronized在JVM層面上實現(xiàn)的,不但可以通過一些監(jiān)控工具監(jiān)控 Synchronized的鎖定,而且在代碼執(zhí)行岀現(xiàn)異常時,JVM會自動釋放鎖定;但是使用Locκ則不行,Lock是通過代碼實現(xiàn)的,要保證鎖定一定會被釋放,就必須將unlock()放到finally{}中。
從性能角度,Synchronized早期實現(xiàn)比較低效,對比ReentrantLock,大多數(shù)場景性能都相差較大。但是在Java 6中對其進(jìn)行了非常多的改進(jìn),在競爭不激烈時,Synchronized的性能要優(yōu)于ReetrantLock;在高競爭情況下,Synchronized的性能會下降幾十倍,但是ReetrantLock的性能能維持常。
猜你喜歡