Chapter 5 Java中的鎖(二)

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對象的。


Condition使用示例

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)的鎖。


BoundedQueue


BoundedQueue
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容