Java中的鎖-悲觀鎖、樂觀鎖,公平鎖、非公平鎖,互斥鎖、讀寫鎖


 

 

總覽圖

這里寫圖片描述

如果文中內容有錯誤,歡迎指出,謝謝。

悲觀鎖、樂觀鎖

悲觀鎖、樂觀鎖使用場景是針對數據庫操作來說的,是一種鎖機制。

悲觀鎖(Pessimistic Lock):顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖(Optimistic Lock):顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制,即對數據做版本控制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

公平鎖、非公平鎖

公平鎖(Fair):加鎖前檢查是否有排隊等待的線程,優先排隊等待的線程,先來先得。

非公平鎖(Nonfair):加鎖時不考慮排隊等待問題,直接嘗試獲取鎖,獲取不到自動到隊尾等待。

ReentrantLock鎖內部提供了公平鎖與分公平鎖內部類之分,默認是非公平鎖,如:

   public ReentrantLock() {
        sync = new NonfairSync();
    }
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

互斥鎖、讀寫鎖

互斥鎖:指的是一次最多只能有一個線程持有的鎖。在jdk1.5之前, 我們通常使用synchronized機制控制多個線程對共享資源的訪問。 而現在, Lock提供了比synchronized機制更廣泛的鎖定操作, Lock和synchronized機制的主要區別: 
synchronized機制提供了對與每個對象相關的隱式監視器鎖的訪問,並強制所有鎖獲取和釋放均要出現在一個塊結構中,當獲取了多個鎖時, 它們必須以相反的順序釋放。synchronized機制對鎖的釋放是隱式的,只要線程運行的代碼超出了synchronized語句塊范圍,鎖就會被釋放。而Lock機制必須顯式的調用Lock對象的unlock()方法才能釋放鎖,這為獲取鎖和釋放鎖不出現在同一個塊結構中,以及以更自由的順序釋放鎖提供了可能。

讀寫鎖:ReadWriteLock接口及其實現類ReentrantReadWriteLock,默認情況下也是非公平鎖。

ReentrantReadWriteLock中定義了2個內部類,ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock,分別用來代表讀取鎖和寫入鎖,ReentrantReadWriteLock對象提供了readLock()和writeLock()方法,用於獲取讀取鎖和寫入鎖。

java.util.concurrent.locks.ReadWriteLock接口允許一次讀取多個線程,但一次只能寫入一個線程:

  • 讀鎖 - 如果沒有線程鎖定ReadWriteLock進行寫入,則多線程可以訪問讀鎖。

  • 寫鎖 - 如果沒有線程正在讀或寫,那么一個線程可以訪問寫鎖。

其中:

  • 讀取鎖允許多個reader線程同時持有,而寫入鎖最多只能有一個writer線程持有。
  • 讀寫鎖的使用場合是:讀取數據的頻率遠大於修改共享數據的頻率。在上述場合下使用讀寫鎖控制共享資源的訪問,可以提高並發性能。
  • 如果一個線程已經持有了寫入鎖,則可以再持有讀鎖。相反,如果一個線程已經持有了讀取鎖,則在釋放該讀取鎖之前,不能再持有寫入鎖。
  • 可以調用寫入鎖的newCondition()方法獲取與該寫入鎖綁定的Condition對象,此時與普通的互斥鎖並沒有什么區別,但是調用讀取鎖的newCondition()方法將拋出異常。

參考

http://www.cnblogs.com/hane/p/7344572.html

http://www.cnblogs.com/jalja/p/5895051.html

http://www.cnblogs.com/aspirant/p/6747115.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM