在ConcurrentHashMAP中,为什么首先在Java 7中引入了HashEntry,为什么在JDK8中将其删除?

时间:2018-06-26 09:40:52

标签: java collections

我试图了解ConcurrentHashMAP(CHM)的实现,但看起来Java 7和Jav8 CHM的实现之间存在巨大差异,

1)我试图从第一个问题开始理解,为什么HashEntry首先在Java 7中引入,为什么在JDK8中将其删除?

2)什么因素定义CHM中的表大小,是并发级别还是容量?

/**
 * Stripped-down version of helper class used in previous version,
 * declared for the sake of serialization compatibility
 */
static class Segment<K,V> extends ReentrantLock implements Serializable {
    private static final long serialVersionUID = 2249069246763182397L;
    final float loadFactor;
    Segment(float lf) { this.loadFactor = lf; }
}

3)并发级别扮演两个角色吗?

一种方法是调整表的大小,然后确定可以更新其映射的并发线程数? concurrencylevel在CHM的内部实现中起什么作用,即如何使用此变量值限制线程数,实现的哪一部分决定了这一点?

1 个答案:

答案 0 :(得分:0)

您似乎对ConcurrentHashMap及其引入的意图没有足够的了解。引入它是为了以最小的锁定完成并发的读写操作。使用ConcurrentHashMap,可以同时锁定地图的不同部分。在Java 8中,它们使ConcurrentHashMap更加无锁。

Concurrencylevel在确定ConcurrentHashMap的各种属性值方面起着重要作用。

1)我试图从第一个问题开始理解,为什么HashEntry首先在Java 7中引入,为什么在JDK8中将其删除?

答案-您确定已将其删除吗?它可能仍然存在于细分市场下。请参见下面-

ConcurrentHashMap

2)什么因素定义CHM中的表大小,是并发级别还是容量?

答案-并发级别决定一切。默认并发级别是16或32。您也可以通过编程方式设置它。

3)并发级别扮演两个角色吗?一种是确定表的大小,然后确定可以更新其映射的并发线程数?

答案-是。它为调整大小提供了提示。通常,段和并发线程的数量限制为该数量。

并发级别在CHM的内部实现中的作用是什么,即如何使用此变量值限制线程数,实现的哪一部分决定了这一点?

您可以查看oracle文档。

CocurrentHashMap

更多参考-

Java 8 ConcurrentHashMap