Java ConcurrentHashMap如何处理重灰化?
我想知道当另一个线程仍在另一个段/分区上写入时,ConcurrentHashMap如何处理重置。据我所知,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,对吗 每个分段都单独重新灰化,因此不
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;