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