3

我是 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 中分段的基本原理是什么以及为什么要使用它?请就细分概念提供更多建议。

4

2 回答 2

2

并发散列映射将其内容划分为段,以减少写入器锁争用。

concurrencyLevel参数定义段数。默认为 16。

于 2013-04-07T03:55:04.890 回答
0

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

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

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

于 2017-06-12T09:31:59.370 回答