synchronized的缺陷
1.效率低:鎖的釋放情況少,只有代碼執行完畢或者異常結束才會釋放鎖;試圖獲取鎖的時候不能設定超時,不能中斷一個正在使用鎖的線程,相對而言,Lock可以中斷和設置超時。
2.不夠靈活:加鎖和釋放的時機單一,每個鎖僅有一個單一的條件(某個對象),相對而言,讀寫鎖更加靈活
3.無法知道是否成功獲得鎖,相對而言,Lock可以拿到狀態
Lock解決相應問題
Lock類這里不做過多解釋,主要看里面的4個方法:
lock(): 加鎖 unlock(): 解鎖 tryLock(): 嘗試獲取鎖,返回一個boolean值 tryLock(long,TimeUtil): 嘗試獲取鎖,可以設置超時
Synchronized只有鎖只與一個條件(是否獲取鎖)相關聯,不靈活,后來Condition與Lock的結合解決了這個問題。
多線程競爭一個鎖時,其余未得到鎖的線程只能不停的嘗試獲得鎖,而不能中斷。高并發的情況下會導致性能下降。ReentrantLock的lockInterruptibly()方法可以優先考慮響應中斷。 一個線程等待時間過長,它可以中斷自己,然后ReentrantLock響應這個中斷,不再讓這個線程繼續等待。有了這個機制,使用ReentrantLock時就不會像synchronized那樣產生死鎖了。