併發程式設計實戰——鎖分段

weixin_33896726發表於2016-07-19

鎖分段概述

  在某些情況下,可以將鎖分解技術進一步擴充套件為對一組獨立物件上的鎖進行分解,這種情況被稱為鎖分段。例如:ConcurrentHashMap

鎖分段的缺點

  與採用單個鎖來實現獨佔訪問相比,要獲取多個鎖來實現獨佔訪問將更加困難並且開銷更高。通常,在執行一個操作時最多隻需獲取一個鎖,但在某些情況下需要加鎖整個容器,例如當ConcurrentHashMap需要擴充套件對映範圍,以及重新計算鍵值的雜湊值要分佈到更大的桶集合中時,就需要獲取分段鎖集合中所有的鎖(要獲取內建鎖的一個集合,能採用的唯一方式是遞迴)。

舉個栗子?

  下面這個StripedMap類中給出了基於雜湊的Map實現,其中使用了鎖分段技術。它擁有N_LOCKS個鎖,並且每個鎖保護雜湊通的一個子集。大多數方法,例如get,都只需要獲得一個鎖,而有些方法則需要獲得所有的鎖,但並不要求同時獲得,例如clear方法的實現(這種清除Map的方式並不是原子操作,因此可能當StripedMap為空時其他的執行緒正併發地向其中新增元素)。

相關文章