【问题标题】:Segmentation in ConcurrentHashMapConcurrentHashMap 中的分割
【发布时间】:2013-04-07 03:52:32
【问题描述】:

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

【问题讨论】:

    标签: java hashmap concurrenthashmap


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多