1. 程式人生 > >26-java.util.concurrent.locks包分析

26-java.util.concurrent.locks包分析

  1. java.util.concurrent.locks包分析
    1. 類關係圖

    1. Lock介面分析
      1. 優點

tryLock():允許在一定的時間內來獲取鎖,獲取失敗則返回false,這樣執行緒可以執行其它的操作,而不至於使執行緒進入休眠(synchronized獲取失敗則進入阻塞佇列中等待)。

ReentrantReadWriteLock:提供了讀鎖和寫鎖,允許多個執行緒獲得讀鎖、而只能有一個執行緒獲得寫鎖。

鎖的獲取和釋放可以在不同的程式碼塊、不同的方法中。且當獲取了多個鎖時,允許以任何順序獲取和釋放多個鎖。

      1. 發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象
      2. 方法

獲取

void

lock()

獲取鎖。如果鎖已被其他執行緒獲取,則進行等待。

發生異常時,不會自動釋放鎖,需在finally中去釋放鎖

void

lockInterruptibly()

+ 等待獲取鎖的過程,可被B.interrupt()中斷

發生異常時,不會自動釋放鎖,需在finally中去釋放鎖

boolean

tryLock()

tryLock(long,TimeUnit)

在給定時間內獲取鎖,獲取失敗則返回false

發生異常時,不會自動釋放鎖,需在finally中去釋放鎖

釋放

void

unlock()

釋放鎖,通常在finally中釋放

必須在獲取鎖成功的情況下才能釋放,IllegalMonitorStateException

其他

Condition

newCondition()

返回繫結到此 Lock 例項的新 Condition 例項。

 

    1. Condition介面分析
      1. 特點

條件佇列,相當於synchronized(obj)中的物件監視器obj。但是synchronized只能提供一個物件鎖。而Lock.newCondition(),可以獲取對應鎖上的多個條件佇列。

      1. 方法

await():造成當前執行緒在接到訊號或被中斷之前一直處於等待狀態。

await(long time, TimeUnit unit):成當前執行緒在接到訊號、被中斷或到達指定等待時間之前一直處於等待狀態。

signal():喚醒一個等待執行緒。

signalAll():喚醒所有等待執行緒。

    1. ReadWriteLock介面分析
      1. 特點

ReadWriteLock 維護了一對相關的鎖,一個用於只讀操作,另一個用於寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 執行緒同時保持。寫入鎖是獨佔的。

      1. 方法

Lock:readLock():返回用於讀取操作的鎖。

Lock:writeLock() :返回用於寫入操作的鎖。

 

    1. ReentrantReadWriteLock案例分析
  1. 邏輯

  1. 執行結果

寫寫,寫讀相互獨立。讀讀可並行

 

    1. ReentrantLock 可重入的互斥鎖
      1. 構造方法

Lock lock = new ReentrantLock(); 預設為非公平鎖

Lock lock = new ReentrantLock(true); 非公平鎖

公平鎖模式下,一般而言,等待時間最久的執行緒(最先請求的執行緒)會獲得該鎖。而在非公平鎖例下,則無法保證鎖的獲取是按照請求鎖的順序進行的。

      1. 常用方法

lock鎖是不是公平鎖:lock.isFair()

當前執行緒獲取到lock鎖的次數:lock.getHoldCount()

等待獲取lock鎖的執行緒個數:lock.getQueueLength()

執行緒t是否在等待獲取鎖lock:lock.hasQueuedThread(t)

是否有執行緒在等待獲取鎖lock:lock.hasQueuedThreads()

當前執行緒是否持有鎖lock:lock.isHeldByCurrentThread()

鎖lock是不是被任意執行緒持有中:lock.isLocked()

      1. 使用案例:生產消費者模型
  • 客戶端:

  • 生產者執行緒

  • 消費者執行緒

多執行緒學習大綱:https://mp.csdn.net/postedit/84768644