JDK7.0的ConcurrentHashMap
在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链表,它的作用是什么? 并发 集合 --------------------编程问答-------------------- --------------------编程问答-------------------- 看上去是停止条件啊 --------------------编程问答-------------------- 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循环吧
补充:Java , Web 开发