5.4 讀寫鎖
之前提到的鎖如Mutex和ReentrantLock都是排它鎖,這些鎖同一時刻都只允許一個線程進行訪問。而讀寫鎖在同一時刻可以允許多個讀線程進行訪問,但在寫線程訪問時,所有的其他讀線程和寫線程均被阻塞。
讀寫鎖維護了一個同步器,一個讀鎖和一個寫鎖。讀鎖lock()時調(diào)用同步器的tryAcquireShared方法,寫鎖lock()時調(diào)用同步器tryAcquire方法。
5.6 Condition接口
任意一個Java對象,都擁有一組監(jiān)視器方法(定義在java.lang.Object上),主要包括wait(),wait(long timeout),notify()以及notifyAll()方法,這些方法與synchronized同步關(guān)鍵字配合,可以實現(xiàn)等待/通知模式。Condition接口也提供了類似Object的監(jiān)視器方法,與Lock配合可以實現(xiàn)等待/通知模式。
Condition接口定義了等待/通知兩種類型的方法,當前線程調(diào)用這些方法時,需要提前獲取到Condition對象關(guān)聯(lián)的鎖。Condition對象是由Lock對象(調(diào)用Lock對象的newCondition()方法)創(chuàng)建出來的,換句話來說,Condition是依賴Lock對象的。
Object的監(jiān)視器方法與Condition接口的對比:
(1)Condition支持在等待狀態(tài)中不響應中斷(void awaitUninterruptibly)。
(2)Condition支持當前線程釋放鎖并進入等待狀態(tài)直至將來某個時間(boolean awaitUntil(Date deadline) throws InterruptedException)。
Condition的部分方法以及描述:
(1)void await() throws InterruptedException:當前線程進入等待狀態(tài)直至被通知(signal)或被中斷。如果當前線程從await()方法中返回,那么表明該線程已經(jīng)或得了Condition對象所對應的鎖。
(2)void awaitUninterruptibly():當前線程進入等待狀態(tài),不響應中斷。
(3)long awaitNanos(long nanosTimeout)throws InterruptedException:當前線程進入等待狀態(tài)直到被通知,中斷或者超時。返回值表示剩余時間(nanosTimeout-實際耗時),如果返回值是0或者負數(shù),那么可以認定超時了。
(4)boolean awaitUntil(Date deadline) throws InterruptedException:當前線程進入等待狀態(tài)直到被通知,中斷或者到達某個時間點。如果沒有到達某個時間點就被通知,方法返回true,否則表示到達了指定時間,方法返回false。
(5)void signal():喚醒一個等待在Condition上的線程,該線程從等待方法返回前必須獲得與Condition相關(guān)聯(lián)的鎖。
(6)void signalAll():喚醒所有等待在Condition上的線程,能夠從等待方法返回的線程必須獲得與Condition相關(guān)聯(lián)的鎖。