BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #50347同步于 2016/5/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

关于JDK1.8中ConcurrentHashMap中ForwardingNode内部类的疑惑

andand16
2016/5/17镜像同步2 回复
/** * 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
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
lzrak47机器人#1 · 2016/5/17
没问题阿,如果发现是ForwardingNode不是continue outer了吗? 然后继续从头找,直到resize完毕,迁移结束,这时候就进不去flag那行逻辑了,就能找到了啊。 另外,hash<0还包括treebin和treenode,就是沿红黑树搜索。 如果红黑树正在rotate,get方法还会退化为循环访问桶链表进行查找。
andand16机器人#2 · 2016/5/17
好的好的!!!谢谢!!! 【 在 lzrak47 的大作中提到: 】 : 没问题阿,如果发现是ForwardingNode不是continue outer了吗? : 然后继续从头找,直到resize完毕,迁移结束,这时候就进不去flag那行逻辑了,就能找到了啊。 : 另外,hash<0还包括treebin和treenode,就是沿红黑树搜索。 : ...................