CLH同步佇列是怎麼實現非公平和公平的

2021-10-01 21:20:21 字數 712 閱讀 7879

the wait queue is a variant of a 「clh」 (craig, landin, and hagersten) lock queue. clh locks are normally used for spinlocks

1、名稱:clh 由三個人名字組成 (craig, landin, and hagersten)

2、資料結構:fifo雙向鍊錶

3、作用:等待資源釋放的佇列

公平鎖和非公平鎖在於hasqueuedpredecessors()這個方法

public final boolean hasqueuedpredecessors()
執行緒在doacquire方法中獲取鎖時,會先加入同步佇列,之後根據情況再陷入阻塞。當阻塞後的節點一段時間後醒來時,這時候來了更多的新執行緒來搶鎖,這些新執行緒還沒有加入到同步佇列中去,也就是在tryacquire方法中獲取鎖

在公平鎖下,這些新執行緒會發現同步佇列中存在節點等待,那麼這些新執行緒將無法獲取到鎖,去排隊;

而在非公平鎖下,這些新執行緒會跟排隊甦醒的執行緒進行鎖爭搶,失敗的去同步佇列中排隊。因此這裡的公平與否,針對的其實是甦醒執行緒與還未加入同步佇列的執行緒,而對於已經在同步佇列中阻塞的執行緒而言,它們內部自身其實是公平的,因為它們是按順序被喚醒的,這是根據aqs節點喚醒機制和同步佇列的fifo特性決定的。

CLH同步佇列

aqs內部維護著乙個fifo佇列,該佇列就是clh同步佇列。clh同步佇列是乙個fifo雙向佇列,aqs依賴它來完成同步狀態的管理,當前執行緒如果獲取同步狀態失敗時,aqs則會將當前執行緒已經等待狀態等資訊構造成乙個節點 node 並將其加入到clh同步佇列,同時會阻塞當前執行緒,當同步狀態釋放時,...

c 執行緒池實現(二)同步佇列實現

前面我們介紹了半同步半非同步執行緒池的概念,下面我們首先說一下同步佇列。同步佇列是半同步半非同步執行緒池三層中的中間層 排隊層。它一方面提供介面給上面同步服務層新增新任務,一方面提供介面給下面的非同步服務層獲取任務。上層可能是併發的新增任務,因此同步佇列需要保證任務是執行緒安全的,同時它還需要確保任...

c 執行緒池實現(三)同步佇列實現

前面設計同步佇列的 下面詳細說說實現。pushvoid push t task not full variable wait lock,this queue push std forward task not empty variable notify one void push const t t...