簡體   English   中英

ConcurrentHashMap如何處理rehashing?

[英]How does ConcurrentHashMap handle rehashing?

我想知道ConcurrentHashMap如何處理rehashing而另一個線程仍然在另一個段/分區上寫。 據我所知,ConcurrentHashMap獨立地鎖定了段,因此,例如,Thread1在Thread2寫入segment2之前稍微寫入segment1,如果它要求表在Thread1插入后調整大小並重新散列,會發生什么,但是Thread2位於中間寫作操作? 它會鎖定整個地圖以進行重組嗎? 它是否有類似告訴Thread2停止並等到rehash完成? 因為Thread2可能有機會在表調整大小后最終寫出segment1,對嗎?

每個段都單獨重新分段,因此不會發生沖突。

ConcurrentHashMap是一組專用哈希表,稱為Segments

從源代碼

final Segment<K,V>[] segments;

/**
 * Segments are specialized versions of hash tables.  This
 * subclasses from ReentrantLock opportunistically, just to
 * simplify some locking and avoid separate construction.
 */

如果你檢查返回Segment的方法

final Segment<K,V> segmentFor(int hash) {
    return segments[(hash >>> segmentShift) & segmentMask];
}

因此,如果您先調用put it,則使用segmentFor確定Segment ,然后在該Segment上調用put

put源代碼

public V put(K key, V value) {
    if (value == null)
        throw new NullPointerException();
    int hash = hash(key.hashCode());
    return segmentFor(hash).put(key, hash, value, false);
}

ConcurrentHashMap中,為每個段創建表數組。 基於concurrencyLevel創建的Segments數組。

    /**
     * The per-segment table. Elements are accessed via
     * entryAt/setEntryAt providing volatile semantics.
     */
    transient volatile HashEntry<K,V>[] table;

所以REHASHING也將在每個細分的表格中完成。 所以這不會影響另一個細分的表格。

這類似於Array {elements}(2D)的Array {Segments}。 所以非常快:)

暫無
暫無

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

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