淺析樂觀鎖與悲觀鎖

1. 定義

  • 悲觀鎖:總是假設最壞的情況,每次去拿數據(讀數據)的時候都認爲別人會修改,所以每次在拿數據(讀數據)的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。
  • 樂觀鎖:顧名思義,就是很樂觀,每次去拿數據(讀數據)的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候(修改數據)會判斷一下在此期間別人有沒有去更新這個數據。

2. 應用場景

  1. 悲觀鎖
  • 傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖
  • Java裏面的同步原語synchronized關鍵字的實現也是悲觀鎖
  1. 樂觀鎖
  • 數據庫提供的類似於write_condition機制,其實都是提供的樂觀鎖
  • Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS機制

3. 悲觀鎖的劣勢

悲觀鎖機制存在以下問題:

  1. 在多線程競爭下,加鎖、釋放鎖會導致比較多的上下文切換和調度延時,引起性能問題
  2. 一個線程持有鎖會導致其它所有需要此鎖的線程掛起
  3. 如果一個優先級高的線程等待一個優先級低的線程釋放鎖會導致優先級倒置,引起性能風險

4. 樂觀鎖

  • 樂觀鎖就是:每次不加鎖而是假設沒有併發衝突而去完成某項操作,如果因爲併發衝突失敗就重試,直到成功爲止。
  • 樂觀鎖( Optimistic Locking )其實就是一種思想。樂觀鎖假設認爲數據一般情況下不會產生併發衝突,所以在數據進行提交更新的時候,纔會正式對數據是否產生併發衝突進行檢測,如果發現併發衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去做。
  • 樂觀鎖的概念中其實已經闡述了它的具體實現細節:主要就是兩個步驟:衝突檢測和數據更新。其實現方式有一種比較典型的就是 Compare and Swap ( CAS )。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章