在map的remove方法中调用了Segment的remove方法。
这个方法里首先会尝试tryLock,如果失败,调用scanAndLock。
在scanAndLock里会在尝试tryLock一定次数以后调用lock方法,直到获取锁后break跳出scanAndLock。问题:
scanAndLock方法中的这部分:
if (retries < 0) {
    if (e == null || key.equals(e.key))
        retries = 0;
    else
        e = e.next;
}
会遍历HashEntry链表,它的作用是什么?并发集合

解决方案 »

  1.   

    private void scanAndLock(Object key, int hash) {
                // similar to but simpler than scanAndLockForPut
                HashEntry<K,V> first = entryForHash(this, hash);
                HashEntry<K,V> e = first;
                int retries = -1;
                while (!tryLock()) {
                    HashEntry<K,V> f;
                    if (retries < 0) {
                        if (e == null || 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;
                        retries = -1;
                    }
                }
            }停止的条件是tryLock成功获取锁之后返回true跳出while循环
    或者重试次数超过max,调用阻塞线程的lock成功获取锁之后,break跳出while循环吧