深度解析 Condition實現原理

2021-09-20 09:31:56 字數 780 閱讀 6235

condition指的就是conditionobject,是aqs的乙個內部類。conditionobject的原理是基於aqs的node內部類維護了兩個佇列,乙個等待佇列,乙個同步佇列;乙個是單向佇列,乙個是雙向佇列。

如果某個執行緒呼叫了await方法之後,就會使當前執行緒進入到等待狀態,原理就是先獲取當前執行緒的狀態,然後生成乙個node節點,將當前節點加入到等待佇列中。它會先判斷等待佇列是否存在頭節點,如果沒有頭節點的話,就說明當前等待佇列的鍊錶為空,那麼就會將當前的節點設定成頭節點,為節點也指向這個節點;如果等待佇列中有頭節點,就說明原等待佇列鍊錶不為空,然後將當前節點加入到鍊錶的尾部,作為尾節點,將原來節點的next指標指向當前節點。 

呼叫signal方法的時候,就是將首節點於首節點的下乙個節點斷開關係,並將首節點加入到同步佇列中,就是aqs維護的雙向佇列,只有在這個佇列中的執行緒節點才有機會去搶占cpu資源。

將執行緒節點加入到等待佇列原始碼:

呼叫signal方法,將等待節點加入到同步佇列原始碼:

使用Condition實現多路等待通知

乙個鎖內部可以有多個condition,即有多路等待和通知,可參考jdk1.5的lock和condition實現的可阻塞佇列的應用案例,在傳統的執行緒機制中乙個監視器物件上只能有一路等待和通知,要想實現多路等待和通知,必須巢狀使用多個同步監視器物件.使用condition可簡單實現多路等待通知 pu...

STL庫list sort 實現深度解析

stl庫list sort 實現深度解析 list模板的定義以及一些基本成員函式的實現這裡我就不贅述了,還不清楚的同學可以到網上查詢相關資料或者直接檢視侯捷翻譯的 stl原始碼剖析 相應章節。我之所以寫這篇筆記是因為當時看到list sort 原始碼時一時沒看懂,後來在vs專案裡一步步跟蹤資料變化發...

Lock和Condition實現多執行緒迴圈執行

我們可能有如下使用場景 a b c三個執行緒,業務需要a執行5遍,然後b執行10遍,然後c執行15遍,如此迴圈 這時候我們可以考慮用到lock的condition機制 public class locktest for int i 0 i 5 i number 2 c2.signal lock.un...