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