我试图了解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的内部实现中起什么作用,即如何使用此变量值限制线程数,实现的哪一部分决定了这一点?
答案 0 :(得分:0)
您似乎对ConcurrentHashMap及其引入的意图没有足够的了解。引入它是为了以最小的锁定完成并发的读写操作。使用ConcurrentHashMap,可以同时锁定地图的不同部分。在Java 8中,它们使ConcurrentHashMap更加无锁。
Concurrencylevel在确定ConcurrentHashMap的各种属性值方面起着重要作用。
1)我试图从第一个问题开始理解,为什么HashEntry首先在Java 7中引入,为什么在JDK8中将其删除?
答案-您确定已将其删除吗?它可能仍然存在于细分市场下。请参见下面-
2)什么因素定义CHM中的表大小,是并发级别还是容量?
答案-并发级别决定一切。默认并发级别是16或32。您也可以通过编程方式设置它。
3)并发级别扮演两个角色吗?一种是确定表的大小,然后确定可以更新其映射的并发线程数?
答案-是。它为调整大小提供了提示。通常,段和并发线程的数量限制为该数量。
并发级别在CHM的内部实现中的作用是什么,即如何使用此变量值限制线程数,实现的哪一部分决定了这一点?
您可以查看oracle文档。
更多参考-