Java ConcurrentHashMap如何处理重灰化?

Java ConcurrentHashMap如何处理重灰化?,java,multithreading,java.util.concurrent,concurrenthashmap,Java,Multithreading,Java.util.concurrent,Concurrenthashmap,我想知道当另一个线程仍在另一个段/分区上写入时,ConcurrentHashMap如何处理重置。据我所知,ConcurrentHashMap独立锁定该段,例如, TyRe1在Trace2写入Stuts2之前略微写入StEnt1,如果在Trace1插入之后需要表调整大小和重整,但THeLe2处于写入操作的中间,会发生什么情况?它会锁定整个地图进行重新灰化吗?它是否有类似于告诉Thread2停止并等待重播完成的功能?因为Thread2有可能在调整表大小后写入段1,对吗 每个分段都单独重新灰化,因此不

我想知道当另一个线程仍在另一个段/分区上写入时,ConcurrentHashMap如何处理重置。据我所知,ConcurrentHashMap独立锁定该段,例如,
TyRe1在Trace2写入Stuts2之前略微写入StEnt1,如果在Trace1插入之后需要表调整大小和重整,但THeLe2处于写入操作的中间,会发生什么情况?它会锁定整个地图进行重新灰化吗?它是否有类似于告诉Thread2停止并等待重播完成的功能?因为Thread2有可能在调整表大小后写入段1,对吗

每个分段都单独重新灰化,因此不会发生碰撞

ConcurrentHashMap
是一组专门的哈希表,称为

从源代码

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.
 */
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
中,为每个段创建表数组。 以及基于
concurrentylevel
创建的段数组

    /**
     * The per-segment table. Elements are accessed via
     * entryAt/setEntryAt providing volatile semantics.
     */
    transient volatile HashEntry<K,V>[] table;
/**
*“每段”表。元素可通过以下方式访问:
*entryAt/setEntryAt提供易失性语义。
*/
瞬时易失性HashEntry[]表;
因此,还将根据段的表进行重新灰化。因此,这不会影响另一段的表


这类似于数组{elements}(2D)的数组{Segments}。非常快:)

对于我上面提供的场景来说也是如此。由于有人正在编写,它将首先重新刷新段1,然后离开段2,然后转到下一个段,最后在激活段2后重新刷新段2?不,这就像是段被独立地重新刷新一样。因此,如果段1需要重新哈希,那么只有它才会重新哈希。所以哈希是单独处理的?@user1389813每个段都处理它的哈希。@user1389813这就是为什么我添加了
segmentFor
方法的源代码,以避免混淆。还添加了put方法源。
    /**
     * The per-segment table. Elements are accessed via
     * entryAt/setEntryAt providing volatile semantics.
     */
    transient volatile HashEntry<K,V>[] table;