JDK7.0的ConcurrentHashMap

userlky1993 2013-05-06 09:39:44
在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链表,它的作用是什么?
...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
ConcurrentHashMap很早就有了吧。
Six_Year 2015-07-27
  • 打赏
  • 举报
回复
我今天也看到了 ,跟你有一样的疑问,函数返回值为void,源码注释中说:Upon return, guarantees that lock is held.那么为什么不直接进行加锁操作。
七神之光 2013-05-08
  • 打赏
  • 举报
回复
看上去是停止条件啊
userlky1993 2013-05-08
  • 打赏
  • 举报
回复
userlky1993 2013-05-08
  • 打赏
  • 举报
回复
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循环吧

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧