【Java並發編程實戰】-----“J.U.C”:CLH隊列鎖


在前面介紹的幾篇博客中總是提到CLH隊列,在AQS中CLH隊列是維護一組線程的嚴格按照FIFO的隊列。他能夠確保無飢餓,嚴格的先來先服務的公平性。下圖是CLH隊列節點的示意圖:

2015112100001

在CLH隊列的節點QNode中包含有一個locked的字段,該字段表示該節點是否需要獲取鎖,為true表示需要獲取,為false表示不需要獲取。在CLH隊列中,節點與節點之間並不是通過next指針來連接的而是通過myPred所指向節點的變化情況來影響的myNode的行為。

假設有兩個線程(線程A、線程B)。開始線程A需要獲得鎖,那么他會創建一個QNode節點,並將locked設置為true(表示需要獲取鎖),同時獲取一個指向前驅的myPred並在前驅節點的的locked上面旋轉直到前驅節點是否鎖為止(locked為false,這個動作我們一般稱之為自旋),當然這里會將tail指向自身來表示它是CLH隊列的最后一個節點,如下:

2015112500002

然后線程B添加到CLH隊列中,這時tail域應該指向線程B。

2015112500001

CLH隊列鎖的優點在於空間復雜度低(如果有n個線程,L個鎖,每個線程每次只獲取一個鎖,那么需要的存儲空間是O(L+n),n個線程有n個myNode,L個鎖有L個tail)。CLH的變種體被運用到了AQS中。

參考文獻

JAVA並發編程學習筆記之CLH隊列鎖:http://blog.csdn.net/aesop_wubo/article/details/7533186


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM