簡體   English   中英

ConcurrentHashMap中是否可以有超過32個鎖

[英]Is it possible to have more than 32 locks in ConcurrentHashMap

我讀到ConcurrentHashMap在多線程方面比Hashtable更好,因為在桶級別而不是映射寬鎖定。 每張地圖最多可鎖32次。 想知道為什么32和為什么不超過32鎖。

如果您正在談論Java ConcurrentHashMap ,那么限制是任意的

創建一個與給定地圖具有相同映射的新地圖。 創建的映射的容量是給定映射中映射數的1.5倍或16(以較大者為准),默認加載因子(0.75)和concurrencyLevel(16)。

如果你閱讀了源代碼,很明顯最大段數是2 ^ 16,這對於不久的將來任何可能的需求都應該足夠了。

您可能一直在考慮某些替代實驗實現,如下所示

此類支持硬連線預設並發級別32.這允許最多32個put和/或remove操作同時進行。

請注意,通常,當超過32個線程嘗試更新單個ConcurrentHashMap時,除了同步效率之外的因素通常是瓶頸。

默認值不是32,它是16.並且您可以使用構造函數參數concurrency level覆蓋它:

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor,
                         int concurrencyLevel)

所以你可以這樣做:

Map<String, String> map = new ConcurrentHashmap<String, String)(128, 0.75f, 64);

將其更改為64.默認值為(從Java 6u17開始):

  • initialCapacity :16;
  • loadFactory :0.75f;
  • concurrencyLevel :16。

根據ConcurrentHashMap的來源,允許的最大值為65536

/**
 * The maximum number of segments to allow; used to bound
 * constructor arguments.
 */
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor, int concurrencyLevel) {
    if (concurrencyLevel > MAX_SEGMENTS)
        concurrencyLevel = MAX_SEGMENTS;

要使用16的所有默認並發級別,您需要在同一時刻使用地圖擁有16個核心。 如果您只有25%的時間使用地圖32個核心,那么一次只能使用16個分段中的8個。

總而言之,您需要使用相同的映射並且不做任何其他操作。 真正的程序通常會執行除訪問一個地圖以外的操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM