1. 層面 synchronized屬於jvm層面,是java的關鍵字,是內置特性;而Lock屬於api層面,是java5後產生的一個接口
2. 釋放鎖 synchronized不需要用戶去手動釋放鎖,當synchronized方法或者synchronized代碼塊執行完之後,系統會自動讓線程釋放對鎖的佔用;而Lock則必須要用戶去手動釋放鎖,如果沒有主動釋放鎖,就有可能導致出現死鎖現象。
3. 用法 不一樣。synchronized既可以加在方法上,也可以加載特定的代碼塊上,括號中表示需要鎖的對象。而Lock需要顯示地指定起始位置和終止位置。synchronzied是託管給jvm執行的,Lock鎖定是通過代碼實現的。
4. 性能 上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。
5. 異常 synchronized在發生異常時,會自動釋放線程佔有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;
6. 中斷 Lock可以讓等待鎖的線程響應中斷(tryLock(Long timeout,TimeUnit unit)),而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。Lock可以提高多個線程進行讀操作的效率。
7. 底層實現 synchronized底層用monitor對象完成 (monitorenter、monitorexit)
8. 鎖公平 synchronized是非公平鎖;ReentrantLock可以是公平鎖,也可以是非公平鎖,默認是非公平鎖,通過構造方法傳入boolean值來確定。
9. Condition synchronized沒有;ReentrantLock用以實現分組喚醒需要喚醒的線程,可以精確喚醒,而不像synchronized要麼隨機喚醒一個,要麼全部喚醒。