对HashMap在并发编程中死循环的疑惑

maijia0754 2018-01-26 01:53:45
使用JDK1.7,HashMap的初始化大小为4,负载因子为0.75f,有三个元素被hash到同一个位置,然后在两个线程中分别对其进行put,此时两条线程同时进行扩容,假设扩容时,HashMap中的三个元素又hash到同一个位置上,线程A执行了transfer方法中Entry<K,V> next = e.next语句后,线程A被挂起,执行线程B,在线程B执行完了transfer方法,还没有把扩容后的table赋值给HashMap内部的table,线程B被挂起,线程A继续执行transfer方法,引发了该位置的链表节点循环引用。
疑惑是:在线程A执行了transfer方法中Entry<K,V> next = e.next语句后,线程A被挂起,执行线程B,在线程B执行完了transfer方法,并且把扩容后的table赋值给HashMap内部的table,线程B被挂起,线程A继续执行transfer方法,还会引发死循环吗?
...全文
2280 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
含章可贞 2018-03-13
  • 打赏
  • 举报
回复
HashMap是线程不安全的,有并发情况下建议使用ConcurrentHashMap,它是线程安全。具体你可以看一下这篇文章个人感觉很好的解释了二者的区别https://javadoop.com/post/hashmap
zoeg 2018-03-13
  • 打赏
  • 举报
回复
HashMap本身不是线程安全的
懒笑翻 2018-03-06
  • 打赏
  • 举报
回复
HashMap 线程不安全
Sam_Deep_Thinking 2018-03-06
  • 打赏
  • 举报
回复
可以看一下我写的这篇文章:http://blog.csdn.net/linsongbin1/article/details/54708694
十八道胡同 2018-02-24
  • 打赏
  • 举报
回复
HashMap 是线程不安全的,ConcurrentHashMap是线程安全的
爱摸鱼de老邪 2018-02-21
  • 打赏
  • 举报
回复
在API手册中已经说了HashMap不是线程安全的。
demystify 2018-02-11
  • 打赏
  • 举报
回复
HashMap不是线程安全的,并发时出现死循环很正常,ConcurrentHashMap是线程安全的,如果是多个线程操作一个map,建议使用ConcurrentHashMap。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧