synchronized和lock有什麼區別,用lock有什麼好處

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要麼隨機喚醒一個,要麼全部喚醒。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章