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