每日一题:HashMap为什么线程不安全?2020-06-30

2020-06-30  本文已影响0人  写代码的杰西

1.在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。
2.在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。
因为开始工作以后就是从1.8开始用的,这里只分析1.8的源码
HashMap的put方法中有这么一行

if ((p = tab[i = (n - 1) & hash]) == null) // 如果没有hash碰撞则直接插入元素
             tab[i] = newNode(hash, key, value, null);

如果经过hash计算以后的位置为null,就直接newNode插入到tab[i]的位置。
这里如果2个线程同时进入,同时计算,得到的结果都是null,然后同时newNode,那么第一个数据就会被覆盖。

上一篇下一篇

猜你喜欢

热点阅读