ConcurrentHashMap的内部工作?
我正在查看ConcurrentHashMap的源代码如何处理并发更新。 但看起来像它复杂的理解。 然后,我想如果我需要实施它,我自己该如何去做。 我想出了简单的算法。 我的问题是我的算法在正确的道路上(我认为是),如果我将它与缺少高级别的jre 6规定的实现进行比较?
基本上我们必须在单个桶级别(而不是整个HashMap)上进行锁定,以便并发更新只需要锁定到达同一个桶的入口。 现在,根据密钥的哈希码确定桶。类似地,如果我们获得基于哈希码的锁,则问题将得到解决。 因此,具有不同哈希码的两个密钥将会转到单独的桶中,因此我们可以对interned哈希码值使用同步块(使用interned值的目的是使得在同一个桶下的相同对象上获取锁)。 在这种情况下,同步将发生在不同的interned哈希码字符串上。 所以,并发散列码可能会发生。
因此,具有相同散列码的两个密钥将转到同一个存储桶。因此,我们可以对interned hashcode值使用同步块并避免并发更新
这里是我提出的put方法
public V put(K key, V value) {
int hashCode = geKeyHashcode();
String stringHashcode = hashCode + "";
synchronized (str.intern()) { // line A
// proceed for put operation
}
}
现在在A行,我们可以停止位于同一个桶/段下的并发更新,尽管继续躺在单独的桶/段下
我相信它可以提高很多,但它的主要目的也可以通过简单的算法来实现。 不是吗?
更新: -如果有人可以更容易的方式转发/指向解释java 6规定的ConcurrentHashMap的资源,这将是伟大的(我试过谷歌搜索,但无法找到解释如何使用不安全的等put方法实现)
链接地址: http://www.djcxy.com/p/91893.html上一篇: Internal working of ConcurrentHashMap?
下一篇: How to work around the stricter Java 8 Javadoc when using Maven