Condition接口详解
生活随笔
收集整理的這篇文章主要介紹了
Condition接口详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、condition和對象監(jiān)視器
Condition是對象監(jiān)視器的替代品,拓展了監(jiān)視器的語義。
都有一組類似的方法:
都需要和鎖進行關(guān)聯(lián):
對象監(jiān)視器: 需要進入synchronized語句塊(進入對象監(jiān)視器)才能調(diào)用對象監(jiān)視器的方法。 Condition對象:需要和一個Lock綁定。Condition拓展的語義方法:
使用方法:
對象監(jiān)視器: 進入synchronized語句塊(進入對象監(jiān)視器)后調(diào)用Object.wait()。 Condition對象: 需要和一個Lock綁定,并顯示的調(diào)用lock()獲取鎖,然后調(diào)用 Condition.await()。等待隊列數(shù)量:
對象監(jiān)視器: 1個。 Condition對象: 多個。通過多次調(diào)用lock.newCondition()返回多個等待隊列。二、Condition接口
不管是發(fā)生中斷還是超時都將繼續(xù)競爭鎖,而不是立即返回,只有再次獲取鎖時才能從等待方法返回(這一點和Object等待方法語義是一致的),根據(jù)中斷狀態(tài)拋出異常。
三、Condition接口使用示例
官方文檔里舉了一個和ArrayBlockingQueue的功能相似的有界塞隊列例子,接下來分析一下
總結(jié):
在Condition中,用await()替換wait(),用signal()替換notify(),用signalAll()替換notifyAll(),傳統(tǒng)線程的通信方式,Condition都可以實現(xiàn),這里注意,Condition是被綁定到Lock上的,要創(chuàng)建一個Lock的Condition必須用newCondition()方法。Condition的強大之處在于,對于一個鎖,我們可以為多個線程間建立不同的Condition。如果采用Object類中的wait(), notify(), notifyAll()實現(xiàn)的話,當寫入數(shù)據(jù)之后需要喚醒讀線程時,不可能通過notify()或notifyAll()明確的指定喚醒讀線程,而只能通過notifyAll喚醒所有線程,但是notifyAll無法區(qū)分喚醒的線程是讀線程,還是寫線程。所以,通過Condition能夠更加精細的控制多線程的休眠與喚醒。
重點注意一點:condition的使用必須依賴于lock對象,通過lock對象的newCondition()方法初始化一個condition對象。
本文參考
總結(jié)
以上是生活随笔為你收集整理的Condition接口详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021全球自由行报告:我的中国,真好玩
- 下一篇: 2021上半年短视频及电商生态研究报告