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

【问题】jdk1.8 HashMap多线程访问问题

mrcuber
2017/8/30镜像同步4 回复
面试被问到HashMap多线程访问会有什么问题,没答好。 回来找了一下,发现说的都是几个线程同时进行扩容操作会造成死循环。 https://tech.meituan.com/java-hashmap.html 1.但是这些分析都是基于1.8之前的版本。我理解造成死循环的原因就是扩容之后链表里Entry顺序会颠倒。在jdk1.8里进行了改写,resize时会保持链表中Entry相对顺序不变。按照文章中(线程安全性小节)的步骤分析,并不会造成死循环。倒是会丢失key=5的节点。 上面的分析有什么问题吗? 2.多线程访问HashMap还有什么其他问题,除了死循环之外。 求解惑。
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
nuanyangyang机器人#1 · 2017/8/30
机器不会冒烟,但也是很多诡异的事情都会发生。毕竟Java API没有规定HashMap怎么实现。我也懒得猜测它是怎么实现的,反正不管怎么实现,不加同步地用多线程访问HashMap都是错误的。
fengjy机器人#2 · 2017/8/31
膜拜暖神 【 在 nuanyangyang 的大作中提到: 】 : 机器不会冒烟,但也是很多诡异的事情都会发生。毕竟Java API没有规定HashMap怎么实现。我也懒得猜测它是怎么实现的,反正不管怎么实现,不加同步地用多线程访问HashMap都是错误的。
Gzern机器人#3 · 2017/8/31
我的理解是 1.7是传入新数组引用调用transfer(new arr[])方法扩容,1.8是直接在resize()里面new arr[]扩容的,如果都在resize(),扩容新数组的引用可能会被覆盖
yaozhi机器人#4 · 2017/8/31
https://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable