我试图理解ConcurrentHashMAP ( CHM )的实现,但它看起来在Java7和CHM的Jav8实现中有很大的不同,
1)我试图从第一个问题开始理解,为什么HashEntry最初是在Java7中引入的,为什么在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)并发级是否在扮演两个角色?
一个是调整表的大小,然后决定并发线程的数量谁可以更新他的映射?在CHM的内部实现中,concurrencylevel的作用是什么?例如,如何使用这个变量值限制线程的数量?实现的哪个部分规定了这一点?
发布于 2018-06-26 19:35:05
看起来你对ConcurrentHashMap及其引入背后的意图并没有完全的理解。引入它是为了以最小的锁定完成并发的读写操作。使用ConcurrentHashMap,可以同时锁定地图的不同部分。在Java8中,他们让ConcurrentHashMap变得更加无锁。
并发级别在决定ConcurrentHashMap的各种属性值时起着重要作用。
1)我试图从第一个问题开始理解,为什么HashEntry最初是在Java7中引入的,为什么在JDK8中删除了它?
答案-你确定它已经被删除了吗?它可能仍然在那里的片段下。请参阅以下内容-
2)在CHM中定义表大小的因素是什么,是并发级别还是容量?
答案-并发级别决定一切。默认并发级别为16或32。你也可以通过编程来设置它。
3)并发级是否在扮演两个角色?一个是调整表的大小,然后决定并发线程的数量谁可以更新他的映射?
答案是-是的。它提供了调整大小的提示。一般情况下,段和并发线程的数量会被限制到这个数量。
在CHM的内部实现中,concurrencylevel的作用是什么?例如,如何使用这个变量值限制线程的数量?实现的哪个部分规定了这一点?
您可以查看oracle文档。
作为进一步的参考-
https://stackoverflow.com/questions/51039675
复制相似问题