![](/img/trans.png)
[英]Does rehashing in ConcurrentHashMap in Java increase the number of segments ?
[英]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.