26-java.util.concurrent.locks包分析
tryLock():允許在一定的時間內來獲取鎖,獲取失敗則返回false,這樣執行緒可以執行其它的操作,而不至於使執行緒進入休眠(synchronized獲取失敗則進入阻塞佇列中等待)。
ReentrantReadWriteLock:提供了讀鎖和寫鎖,允許多個執行緒獲得讀鎖、而只能有一個執行緒獲得寫鎖。
鎖的獲取和釋放可以在不同的程式碼塊、不同的方法中。且當獲取了多個鎖時,允許以任何順序獲取和釋放多個鎖。
獲取 |
void |
lock() |
獲取鎖。如果鎖已被其他執行緒獲取,則進行等待。 |
發生異常時,不會自動釋放鎖,需在finally中去釋放鎖 |
|||
void |
+ 等待獲取鎖的過程,可被B.interrupt()中斷 |
||
發生異常時,不會自動釋放鎖,需在finally中去釋放鎖 |
|||
boolean |
tryLock() |
在給定時間內獲取鎖,獲取失敗則返回false |
|
發生異常時,不會自動釋放鎖,需在finally中去釋放鎖 |
|||
釋放 |
void |
unlock() |
釋放鎖,通常在finally中釋放。 |
必須在獲取鎖成功的情況下才能釋放,IllegalMonitorStateException |
|||
其他 |
返回繫結到此 Lock 例項的新 Condition 例項。 |
條件佇列,相當於synchronized(obj)中的物件監視器obj。但是synchronized只能提供一個物件鎖。而Lock.newCondition(),可以獲取對應鎖上的多個條件佇列。
await():造成當前執行緒在接到訊號或被中斷之前一直處於等待狀態。
await(long time, TimeUnit unit):成當前執行緒在接到訊號、被中斷或到達指定等待時間之前一直處於等待狀態。
signal():喚醒一個等待執行緒。
signalAll():喚醒所有等待執行緒。
ReadWriteLock 維護了一對相關的鎖,一個用於只讀操作,另一個用於寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 執行緒同時保持。寫入鎖是獨佔的。
Lock:readLock():返回用於讀取操作的鎖。
Lock:writeLock() :返回用於寫入操作的鎖。
- 執行結果
寫寫,寫讀相互獨立。讀讀可並行
Lock lock = new ReentrantLock(); 預設為非公平鎖
Lock lock = new ReentrantLock(true); 非公平鎖
公平鎖模式下,一般而言,等待時間最久的執行緒(最先請求的執行緒)會獲得該鎖。而在非公平鎖例下,則無法保證鎖的獲取是按照請求鎖的順序進行的。
lock鎖是不是公平鎖:lock.isFair()
當前執行緒獲取到lock鎖的次數:lock.getHoldCount()
等待獲取lock鎖的執行緒個數:lock.getQueueLength()
執行緒t是否在等待獲取鎖lock:lock.hasQueuedThread(t)
是否有執行緒在等待獲取鎖lock:lock.hasQueuedThreads()
當前執行緒是否持有鎖lock:lock.isHeldByCurrentThread()
鎖lock是不是被任意執行緒持有中:lock.isLocked()
- 生產者執行緒
- 消費者執行緒