返回信息流/**
* A node inserted at head of bins during transfer operations.
*/
static final class ForwardingNode<K,V> extends Node<K,V> {
final Node<K,V>[] nextTable;
ForwardingNode(Node<K,V>[] tab) {
super(MOVED, null, null, null);
this.nextTable = tab;
}
Node<K,V> find(int h, Object k) {
// loop to avoid arbitrarily deep recursion on forwarding nodes
outer: for (Node<K,V>[] tab = nextTable;;) {
Node<K,V> e; int n;
if (k == null || tab == null || (n = tab.length) == 0 ||
(e = tabAt(tab, (n - 1) & h)) == null)
return null;
for (;;) {
int eh; K ek;
if ((eh = e.hash) == h &&
((ek = e.key) == k || (ek != null && k.equals(ek))))
return e;
if (eh < 0) {
if (e instanceof ForwardingNode) {
tab = ((ForwardingNode<K,V>)e).nextTable; //flag
continue outer;
}
else
return e.find(h, k);
}
if ((e = e.next) == null)
return null;
}
}
}
}
该内部类的源码如上
对我注释为flag的那一行,我有一个问题,描述如下:
在CHM的get(Object o)方法中
当定位到的tab数组中的元素hash值小于0的时候,说明该节点为树节点,或是CHM正在扩容(节点类型为ForwardingNode)
对于扩容的情况,会调用ForwardingNode的find()方法去寻找对应的key
由上源码可以看出,当扩容操作正在进行的时候,实际是在nextTable中进行搜索的
我所注释的那一行,说明在newTable中,又会遇到元素对应key的hash值小于0 且 该节点类型为ForwardingNode的情况
那么我的问题来了~
在newTable中出现ForwardingNode节点是什么意思,表示对newTable进行扩容?还是说newTable在新建的时候,其所有元素类型都是ForwardingNode类型?
over
这是一条镜像帖。来源:北邮人论坛 / java / #50347同步于 2016/5/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
关于JDK1.8中ConcurrentHashMap中ForwardingNode内部类的疑惑
andand16
2016/5/17镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
没问题阿,如果发现是ForwardingNode不是continue outer了吗?
然后继续从头找,直到resize完毕,迁移结束,这时候就进不去flag那行逻辑了,就能找到了啊。
另外,hash<0还包括treebin和treenode,就是沿红黑树搜索。
如果红黑树正在rotate,get方法还会退化为循环访问桶链表进行查找。
好的好的!!!谢谢!!!
【 在 lzrak47 的大作中提到: 】
: 没问题阿,如果发现是ForwardingNode不是continue outer了吗?
: 然后继续从头找,直到resize完毕,迁移结束,这时候就进不去flag那行逻辑了,就能找到了啊。
: 另外,hash<0还包括treebin和treenode,就是沿红黑树搜索。
: ...................