1. 程式人生 > >Java編程:悲觀鎖、樂觀鎖的區別及使用場景

Java編程:悲觀鎖、樂觀鎖的區別及使用場景

需要 nbsp 獲取數據 寫入 悲觀鎖 場景 發生 的區別 bsp

定義:

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

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

適用場景:

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

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

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

Java編程:悲觀鎖、樂觀鎖的區別及使用場景