HashMap多线程下的resize()问题
来源:9-4 HashMap与ConcurrentHashMap解析
![](http://img1.sycdn.imooc.com/user/5a2a74ce00010e6e07400417-100-100.jpg)
不知所措_Kevin
2018-08-24
e = key(5)
next = e.next = key(9)
老师,这行代码什么意思,后面也有类似这样的代码,看不太懂能够给解释一下
2回答
-
Jimin
2018-08-24
课程这一部分的执行逻辑为:
1、假设有两个线程同时执行了put操作并同时触发了rehash的操作,
上面的图是线程1,下面的图是线程2
2、线程1当前执行到申请了新的2倍容量的数组,然后准备处理第一个元素5,并记录了下一个准备处理的元素是9. (当前处理的是5,next指针现在指向的是9这个元素)
3、这时线程2完成了整个rehash的操作
4、线程1被唤醒,继续执行之前剩余的代码,这时候呢,线程1里现在指针指向的是5,5操作完next指向的是9。线程1操作后数组索引1后面链表第一个元素是5,线程2操作完之后9的next指针已经指向了5
5、线程1里5处理完要处理下个元素是9,9的位置是要插入到数组索引1的链表首个位置
这个时候,需要注意,9这个元素处理完了,他后面还有一个元素5,因此又要继续处理5
6、当再次把元素5放到数组索引1链表首个位置时,循环链表就出现了。并且key(11)这个元素无法加入到线程1的新数组
在下一次访问该链表时会出现死循环。
012018-08-25 -
Jimin
2018-08-24
你好,这个属于伪代码,实际含义需要结合当时课程中的例子来看,单独看是看不懂的。
课程里 e = key(5) ,next = e.next = key(9) 指的是:当前节点值是5,当一个9被放来的时候,这个节点的next指针就指向的9这个元素了。
这一段讲解的是resize过程中如何在并发的场景下出现循环,需要重点注意看这里每个节点指针的变化,这里加上元素也是方便理解。这个也要明确HashMap是 数组+链表 的结构,每次增加节点时都是在数组上找到位置,然后在对应的链表上进行操作。
00
相似问题