Condition接口详解
生活随笔
收集整理的這篇文章主要介紹了
Condition接口详解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、condition和對(duì)象監(jiān)視器
Condition是對(duì)象監(jiān)視器的替代品,拓展了監(jiān)視器的語(yǔ)義。
都有一組類似的方法:
都需要和鎖進(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綁定。Condition拓展的語(yǔ)義方法:
使用方法:
對(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)拋出異常。
三、Condition接口使用示例
官方文檔里舉了一個(gè)和ArrayBlockingQueue的功能相似的有界塞隊(duì)列例子,接下來(lái)分析一下
總結(jié):
在Condition中,用await()替換wait(),用signal()替換notify(),用signalAll()替換notifyAll(),傳統(tǒng)線程的通信方式,Condition都可以實(shí)現(xiàn),這里注意,Condition是被綁定到Lock上的,要?jiǎng)?chuàng)建一個(gè)Lock的Condition必須用newCondition()方法。Condition的強(qiáng)大之處在于,對(duì)于一個(gè)鎖,我們可以為多個(gè)線程間建立不同的Condition。如果采用Object類中的wait(), notify(), notifyAll()實(shí)現(xiàn)的話,當(dāng)寫(xiě)入數(shù)據(jù)之后需要喚醒讀線程時(shí),不可能通過(guò)notify()或notifyAll()明確的指定喚醒讀線程,而只能通過(guò)notifyAll喚醒所有線程,但是notifyAll無(wú)法區(qū)分喚醒的線程是讀線程,還是寫(xiě)線程。所以,通過(guò)Condition能夠更加精細(xì)的控制多線程的休眠與喚醒。
重點(diǎn)注意一點(diǎn):condition的使用必須依賴于lock對(duì)象,通過(guò)lock對(duì)象的newCondition()方法初始化一個(gè)condition對(duì)象。
本文參考
總結(jié)
以上是生活随笔為你收集整理的Condition接口详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021全球自由行报告:我的中国,真好玩
- 下一篇: 2021上半年短视频及电商生态研究报告