在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链表,它的作用是什么?并发集合
这个方法里首先会尝试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链表,它的作用是什么?并发集合
// 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循环吧