标签:pre 节点 多线程 方便 过程 操作 分享 头部 oschina
假设这里有两个线程同时执行了put()
操作,并进入了transfer()
环节
while(null != e) {
Entry<K,V> next = e.next; //线程1执行到这里被调度挂起了
e.next = newTable[i];
newTable[i] = e;
e = next;
}
那么现在的状态为:
从上面的图我们可以看到,因为线程1的 e 指向了 key(3),而 next 指向了 key(7),在线程2 rehash 后,就指向了线程2 rehash 后的链表。
然后线程1被唤醒了:
e.next = newTable[i]
,于是 key(3)的 next 指向了线程1的新 Hash 表,因为新 Hash 表为空,所以e.next = null
,newTable[i] = e
,所以线程1的新 Hash 表第一个元素指向了线程2新 Hash 表的 key(3)。好了,e 处理完毕。e = next
,将 e 指向 next,所以新的 e 是 key(7)然后该执行 key(3)的 next 节点 key(7)了:
Entry<K,V> next = e.next
,那么 next 就是 key(3)了e.next = newTable[i]
,于是key(7) 的 next 就成了 key(3)newTable[i] = e
,那么线程1的新 Hash 表第一个元素变成了 key(7)e = next
,将 e 指向 next,所以新的 e 是 key(3)这时候的状态图为:
然后又该执行 key(7)的 next 节点 key(3)了:
Entry<K,V> next = e.next
,那么 next 就是 nulle.next = newTable[i]
,于是key(3) 的 next 就成了 key(7)newTable[i] = e
,那么线程1的新 Hash 表第一个元素变成了 key(3)e = next
,将 e 指向 next,所以新的 e 是 key(7)这时候的状态如图所示:
transfer()
就完成了,等put()
的其余过程搞定后,HashMap 的底层实现就是线程1的新 Hash 表了。标签:pre 节点 多线程 方便 过程 操作 分享 头部 oschina
原文地址:https://www.cnblogs.com/xxxuwentao/p/10151616.html