rehash讲解疑问

来源:9-4 HashMap与ConcurrentHashMap解析

qq_灬Mamba磊_0

2018-11-20

两个线程并发执行rehash的时候。 线程1为什么会将key为5的next设置为key为9的呢 那不是扩容前 单线程执行时的操作嘛

写回答

1回答

Jimin

2018-11-21

你好,线程的执行是依赖于cpu按照时间片调度的,因此可能会出现一个线程执行一个时间片后,切换到另一个线程执行的情况。在这个大背景下再去看对于同一个hashmap对象,如果是多个线程都要执行rehash时,如果线程1执行到某一步,切换到线程2去执行,这时就会按照线程2的流程去执行,而线程2要操作的数据又被线程1做了些调整,这样就可能会引发线程不安全的问题。
因此呢,线程不安全的问题不一定肯定出现,需要并发达到一定程度才可能出现。对于是否线程安全,也要考虑多个线程交替执行的问题。

0
1
qq_灬Mamba磊_0
我仔细想了下,视频里说的是线程1某一时刻执行完扩容,准备将key为5的元素的next指针指向9,由于线程调度分配的时间片被用完而停在了这一步操作,这里的疑问就是讲key为5的元素的next指针指向9之前就完成了扩容,这里不应该是插入第三个元素11时因为超过了初始容量和加载因子的乘积而进行了扩容,而不是在将key为5的元素的next指针指向9之前就完成了扩容,这里一直想不通
2018-12-20
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程