【问题标题】:ConcurrentHashMap jdk 8 Uses TreeNodes instead of List .. Why? [closed]ConcurrentHashMap jdk 8 使用 TreeNodes 而不是 List .. 为什么? [关闭]
【发布时间】:2014-09-12 09:49:01
【问题描述】:

您好,我知道在 JDK 8 之前 ConcurrentHashMap 的工作原理。 我也理解了代码:它非常模块化,并不难理解。

JDK 8 中ConcurrentHashMap 的代码与之前的实现相比发生了很大变化。

由于这个问题被归类为过于宽泛,我现在将尝试非常具体。

CHMv8 使用 TreeBin(RedBlackTree 的变体)而不是链表来存储桶。

所以我的问题是使用 TreeBin 而不是链表的主要优势是什么?

Source code here

【问题讨论】:

  • 首先,只有大约 3k 行代码。
  • 除此之外,6K 行代码从什么时候开始“庞大”?
  • @HotLicks 6KLOC 是一个非常可怕的单一课程。 CHM 因包含一堆嵌套类而有所松懈。
  • @DaveNewton 我认为 OP 还计算了 6k 总数中的 cmets + javadoc
  • @dkatzel 显然,但它们不会增加代码的复杂性。这不是 6KLoC。

标签: java multithreading concurrency java.util.concurrent concurrenthashmap


【解决方案1】:

主要更改是添加新的 Java 8 默认 Map 方法的 ConcurrentHashMap 特定实现,以及依赖于内部细节的更好的并发实现。这些更改需要大量新的内部类,它们会使 .java 文件膨胀

例如,其中一些方法包括:

compute(K key, BiFunction remappingFunction)

forEach(BiConsumer action)

merge(K key, V value, BiFunction remappingFunction)

仅举几例。

我认为这也说明了为什么您通常不应该关心您不必维护的类如何工作的实现细节。只要该类遵循其 javadoc 中规定的约定,您就应该不知道它是如何工作的,因为未来的实现细节可能会发生变化。

【讨论】:

  • 谢谢我只是在寻找这种回应。实现对我来说很重要,因为我正在编写一些利基数据结构来处理并发但针对非常具体的要求。我试图采取各种 HasHMap 实现和各种权衡的好东西。我不需要 CHMv8 的所有功能,只需要一些……例如 computeIfAbsent。还想知道他们如何调整大小?
  • 我认为这也说明了为什么你通常不应该关心你不必维护的类如何工作的实现细节 当然,除非你遇到问题.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2015-06-03
  • 2015-04-26
  • 2011-07-08
  • 2015-09-29
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多