@TOC
前言
上篇文章講解了并發(fā)中的顯式鎖與內置鎖,今天就講講CLH隊列鎖
什么是CLH隊列鎖
CLH鎖即Craig, Landin, and Hagersten (CLH)
CLH鎖也是一種基于鏈表的可擴展、高性能、公平的自旋鎖,線程只需要在本地自旋,查詢前驅節(jié)點的狀態(tài),如果前驅節(jié)點釋放了鎖,就結束自旋。
CLH的原理
因為CLH是一個基于鏈表的自旋鎖,所以CLH也就是個鏈表。
當一個線程需要獲得鎖的時候,就會創(chuàng)建一個新的QNode。并將QNode的locked設置為true標識要獲取鎖,并且調用tail的getAndSet方法,讓自己成為隊列的尾部,同時獲取一個指向前驅節(jié)點的myPred。然后就對前驅記節(jié)點的locked自旋,一直到前驅節(jié)點釋放鎖(locked為false)
當一個線程釋放鎖的時候,就將當前節(jié)點的locked設為false,并且將前驅節(jié)點收回,這時候之后節(jié)點就在自旋中檢測到了前驅節(jié)點的鎖釋放,然后去獲取鎖。
CLH隊列圖