HashMap的线程不安全体现在哪里?

一 :jdk1.7及之前的HashMap

    在HashMap扩容的是时候会调用resize()方法中的transfer()方法,在这里由于是头插法所以在多线程情况下可能出现循环链表,所以后面的数据定位到这条链表的时候会造成数据丢失。和读取的可能导致死循环。

二 :jdk1.8HashMap

     1.8的HashMap对此做了优化,resize采用了尾插法,即不改变原来链表的顺序,所以不会出现1.7的循环链表的问题。但是它也不是线程线程安全的。不安全性如下:

     在多线程情况下put时计算出的插入的数组下标可能是相同的,这时可能出现值的覆盖从而导致size也是不准确的。

发布了4 篇原创文章 · 获赞 6 · 访问量 1188

猜你喜欢

转载自blog.csdn.net/qq_33210715/article/details/104748230