ConcurrentHashMap中的分段

时间:2013-04-07 03:52:32

标签: java hashmap concurrenthashmap

我是Java世界的新手,我正在探索ConcurrentHashMap API,我在其中发现了这个:

static final int DEFAULT_INITIAL_CAPACITY = 16;
  static final float DEFAULT_LOAD_FACTOR = 0.75F;
  static final int DEFAULT_CONCURRENCY_LEVEL = 16;
  static final int MAXIMUM_CAPACITY = 1073741824;
  static final int MAX_SEGMENTS = 65536;
  static final int RETRIES_BEFORE_LOCK = 2;
  final Segment<K, V>[] segments;
final Segment<K, V> segmentFor(int paramInt)
  {
    return this.segments[(paramInt >>> this.segmentShift & this.segmentMask)];
  }

ConcurrentHashMap中分段的基本原理是什么以及使用它的原因是什么?请详细说明细分概念。

2 个答案:

答案 0 :(得分:2)

并发哈希映射将其内容划分为段,以减少写入程序锁争用。

concurrencyLevel参数定义了段数。默认情况下是16。

答案 1 :(得分:0)

为了添加其他好的答案,ConcurrentHashMap将地图划分为多个段(基于创建映射时设置的并发级别或默认并发级别16)。

同一段内的并发读取获取最近更新的值,读取不需要锁定且不会被阻止。不同段中的写入可以同时发生,但是,同一段中的两个写入可能会阻塞。

更多信息:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html