Java ConcurrentHashMapJDK 8使用树节点而不是列表。。为什么?

Java ConcurrentHashMapJDK 8使用树节点而不是列表。。为什么?,java,multithreading,concurrency,java.util.concurrent,concurrenthashmap,Java,Multithreading,Concurrency,Java.util.concurrent,Concurrenthashmap,嗨,我知道JDK 8之前的ConcurrentHashMap的工作原理。 我也理解代码:它非常模块化,不难理解 JDK 8中的ConcurrentHashMap代码与以前的实现相比有了很大的变化 因为这个问题被归类为太宽泛了,我现在将尝试非常具体 CHMv8使用TreeBin(RedBlackTree的一种变体)作为存储桶,而不是链表 那么我的问题是,与链表相比,使用TreeBin的主要优势是什么 主要更改是添加新Java 8默认Map方法的ConcurrentHashMap特定实现,这些方法具

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

JDK 8中的
ConcurrentHashMap
代码与以前的实现相比有了很大的变化

因为这个问题被归类为太宽泛了,我现在将尝试非常具体

CHMv8使用TreeBin(RedBlackTree的一种变体)作为存储桶,而不是链表

那么我的问题是,与链表相比,使用TreeBin的主要优势是什么


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

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

仅举几个例子


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

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

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

仅举几个例子


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

首先,只有约3k行代码。除此之外,6K行代码是什么时候“巨大”的?@HotLicks 6KLOC是一个非常可怕的单一类。CHM因为包含了一堆嵌套类而有些懈怠。@DaveNewton我认为OP也在6k中计算注释+javadoctotal@dkatzel显然,它们不会增加代码的复杂性。它不是6KLoC。首先,只有~3k行代码。除此之外,6K行代码从什么时候开始是“巨大的”?@HotLicks 6KLoC是一个相当可怕的单一类。CHM因为包含了一堆嵌套类而有些懈怠。@DaveNewton我认为OP也在6k中计算注释+javadoctotal@dkatzel显然,它们不会增加代码的复杂性。这不是6KLoC。谢谢。我只是在寻找这种回应。实现对我来说很重要,因为我正在编写一些小生境数据结构来处理并发性,但这是为了满足非常具体的需求。我试图从各种HasHMap实现和各种权衡中获得好处。我不需要CHMv8的所有功能,只需要一些。。例如,ComputeFabSent。还想知道他们是如何处理大小调整的?我想这也说明了为什么在遇到问题之前,您通常不应该关心关于不必维护的类如何工作的实现细节。当然,谢谢,我只是在寻找这种响应。实现对我来说很重要,因为我正在编写一些小生境数据结构来处理并发性,但这是为了满足非常具体的需求。我试图从各种HasHMap实现和各种权衡中获得好处。我不需要CHMv8的所有功能,只需要一些。。例如,ComputeFabSent。我还想知道他们是如何调整大小的?我认为这也说明了为什么在遇到问题之前,通常不应该关心实现细节,比如不需要维护的类是如何工作的。