繁体   English   中英

ConcurrentHashMap JDK1.7中的'scanAndLockForPut'

[英]’scanAndLockForPut‘ in ConcurrentHashMap JDK1.7

我的问题是关于文件中的一句话:

在大多数方法中不相似,对方法equals的调用没有被筛选:由于遍历速度无关紧要,我们也可以帮助预热相关的代码和访问。

我无法理解上面这句话。 具体来说,“ 未筛选 ”意味着什么? 为什么我们可以“ 预热相关代码 ”?

scanAndLockForPut

private HashEntry<K,V> scanAndLockForPut(K key, int hash, V value) {
HashEntry<K,V> first = entryForHash(this, hash);
HashEntry<K,V> e = first;
HashEntry<K,V> node = null;
int retries = -1; // negative while locating node
while (!tryLock()) {
    HashEntry<K,V> f; // to recheck first below
    if (retries < 0) {
        if (e == null) {
            if (node == null) // speculatively create node
                node = new HashEntry<K,V>(hash, key, value, null);
            retries = 0;
        }
        else if (key.equals(e.key))
            retries = 0;
        else
            e = e.next;
    }
    else if (++retries > MAX_SCAN_RETRIES) {
        lock();
        break;
    }
    else if ((retries & 1) == 0 &&
             (f = entryForHash(this, hash)) != first) {
        e = first = f; // re-traverse if entry changed
        retries = -1;
    }
}
return node;

具体来说,“未筛选”意味着什么?

在这种情况下,“筛选”意味着在调用equals之前检查身份。 以下声明的左侧也取自CHM:

if ((k = e.key) == key || (e.hash == hash && key.equals(k)))

因此,“未筛选”意味着跳过身份检查。

为什么我们可以“预热相关代码”?

放置并使用键上的equals方法来确定匹配,在预热情况下,更重要的是确定哪些不匹配,即使您正在筛选身份,也始终是等于调用。 如果等待的线程都开始调用key.equals,这将使它“热”并更快地触发JIT编译。 更快的等于方法意味着在放置期间保持段锁定的时间更少。

值得注意的是,在JDK 8中,这一切都已经改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM