Condition是對(duì)象監(jiān)視器的替代品凌净,拓展了監(jiān)視器的語(yǔ)義
區(qū)別與聯(lián)系
- 聯(lián)系
- 都有一組類似的方法:
對(duì)象監(jiān)視器: Object.wait()认罩、Object.wait(long timeout)、Object.notify()聪建、Object.notifyAll()。
Condition對(duì)象: Condition.await()、Condition.awaitNanos(long nanosTimeout)绑莺、Condition.signal()、Condition.signalAll()惕耕。
- 都需要和鎖進(jìn)行關(guān)聯(lián):
對(duì)象監(jiān)視器: 需要進(jìn)入synchronized語(yǔ)句塊(進(jìn)入對(duì)象監(jiān)視器)才能調(diào)用對(duì)象監(jiān)視器的方法纺裁。
Condition對(duì)象:需要和一個(gè)Lock綁定。
- 區(qū)別
- Condition拓展的語(yǔ)義方法:
awaitUninterruptibly():等待時(shí)忽略中斷
awaitUntil(Date deadline) throws InterruptedException:等待到特定日期
- 使用方法:
**對(duì)象監(jiān)視器: **進(jìn)入synchronized語(yǔ)句塊(進(jìn)入對(duì)象監(jiān)視器)后調(diào)用Object.wait()。
**Condition對(duì)象: **需要和一個(gè)Lock綁定欺缘,并顯示的調(diào)用lock()獲取鎖栋豫,然后調(diào)用 Condition.await()。
- 等待隊(duì)列數(shù)量:
**對(duì)象監(jiān)視器: **1個(gè)谚殊。
**Condition對(duì)象: **多個(gè)丧鸯。通過(guò)多次調(diào)用lock.newCondition()返回多個(gè)等待隊(duì)列。
Condition接口
- 聲明
- 等待方法
不管是發(fā)生中斷還是超時(shí)都將繼續(xù)競(jìng)爭(zhēng)鎖嫩絮,而不是立即返回丛肢,只有再次獲取鎖時(shí)才能從等待方法返回(這一點(diǎn)和Object等待方法語(yǔ)義是一致的),根據(jù)中斷狀態(tài)拋出異常絮记,
- 通知方法
AQS內(nèi)部公共類ConditionObject對(duì)Condition接口的實(shí)現(xiàn)
Condition接口使用示例
官方文檔里舉了一個(gè)和ArrayBlockingQueue的功能相似的有界塞隊(duì)列例子摔踱,接下來(lái)分析一下
-
定義
定義了兩個(gè)Condition對(duì)象,notFull非滿等待對(duì)象怨愤,notEmpty非空等待對(duì)象派敷。
-
put 方法
-
take方法