1. 程式人生 > >synchronized和lock的區別;悲觀鎖和樂觀鎖的區別

synchronized和lock的區別;悲觀鎖和樂觀鎖的區別

synchronized和lock的區別: 

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

悲觀鎖、樂觀鎖的區別及使用場景

定義:
悲觀鎖(Pessimistic Lock): 
每次獲取資料的時候,都會擔心資料被修改,所以每次獲取資料的時候都會進行加鎖,確保在自己使用的過程中資料不會被別人修改,使用完成後進行資料解鎖。由於資料進行加鎖,期間對該資料進行讀寫的其他執行緒都會進行等待。

樂觀鎖(Optimistic Lock): 
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫操作。

適用場景:
悲觀鎖:比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。

樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新獲取資料,這樣會增加大量的查詢操作,降低了系統的吞吐量。

總結:兩種所各有優缺點,讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。