synchronized 與 Lock的對比

在java中可以使用 synchronized 和 Lock兩個基本工具來實現鎖。ReentrantLock 與synchronized有相同的併發性和內存語義,還包含了中斷鎖等候和定時鎖等候,意味着線程A如果先獲得了對象obj的鎖,那麼線程B可以在等待指定時間內依然無法獲取鎖,那麼就會自動放棄該鎖
。但是由於synchronized是在JVM層面實現的,因此係統可以監控鎖的釋放與否,而ReentrantLock使用代碼實現的,系統無法自動釋放鎖,需要在代碼中finally子句中顯式釋放鎖lock.unlock();

總結一下,也就是說Lock提供了比synchronized更多的功能。但是要注意以下幾點:
        1)Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現;

  2)synchronized在發生異常時,會自動釋放線程佔有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

  3)Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;

  4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

  5)Lock可以提高多個線程進行讀操作的效率。

使用建議:
在併發量比較小的情況下,使用synchronized是個不錯的選擇,但是在併發量比較高的情況下,其性能下降很嚴重,此時ReentrantLock是個不錯的方案。

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