在java中,對於任意一個java對象,它都擁有一組定義在java.lang.Object上監視器方法,包括wait(),wait(long timeout),notify(),notifyAll(),這些方法配合synchronized關鍵字一起使用可以實現等待/通知模式。

同樣,Condition接口也提供了類似Object監視器的方法,通過與Lock配合來實現等待/通知模式。

ConditionObject是同步器AbstractQueuedSynchronizer的內部類,因爲Condition的操作需要獲取相關聯的鎖,所以作爲同步器的內部類也較爲合理。每個Condition對象都包含着一個隊列(以下稱爲等待隊列),該隊列是Condition對象實現等待/通知功能的關鍵。

Condition源碼分析

在上面我們介紹Lock類時,有一個newCondition方法:

/**

* 返回一個綁定到Lock對象上的Condition實例,在獲取condition對象前,當前線程

* 必須持有對應的lock對象。

*/

Condition newCondition();

從這裏可以猜想到一個Lock中應該綁定一個Condition對象。Condition是Java提供用來實現等待/通知的類。

我們知道Object對象提供了wait、waitAll、notify、notifyAll的方法用來實現線程的同步、等待和喚醒。但Condition類提供了比wait/notify更豐富的功能,Condition對象由lock對象所創建的,同時一個Lock可以創建多個Condition對象,即創建多個對象監聽器,這樣就可以指定喚醒具體線程,而notify是隨機喚醒線程。

“我們相信人人都可以成爲一個IT大神,現在開始,選擇一條陽光大道,助你入門,學習的路上不再迷茫。這裏是北京尚學堂,初學者轉行到IT行業的聚集地。"

查看原文 >>
相關文章