Synchronized 與Lock的不同之處
用法不一樣。synchronized既可以加在方法上,也可以加載特定的代碼塊上,括號中表示需要鎖的對象。而Lock需要顯示地指定起始位置和終止位置。synchronzied是託管給jvm執行的,Lock鎖定是通過代碼實現的。
在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。
鎖的機制不一樣。synchronized獲得鎖和釋放的方式都是在塊結構中,而且是自動釋放鎖。而Lock則需要開發人員手動去釋放,並且必須在finally塊中釋放,否則會引起死鎖問題的發生。
Lock是一個接口,不是Java語言內置的;synchronized是Java語言的關鍵字,因此是內置特性。
採用synchronized不需要用戶去手動釋放鎖,當synchronized方法或者synchronized代碼塊執行完之後或者出現異常時,系統會自動讓線程釋放對鎖的佔用;而Lock在發生異常時,如果沒有主動通unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;
Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。Lock可以提高多個線程進行讀操作的效率。