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