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...