一、hashmap为什么不是线程安全的
原因:
JDK1.7中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。
JDK1.8中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,从而线程不安全。
二、threadlocal为什么不用hashmap
hashmap属于线程不安全,用在线程里不好
三、hashmap死循环原因
HashMap死循环的原因可能是由于哈希冲突导致链表或红黑树的循环引用。当两个不同的键通过哈希函数计算得到相同的索引位置时,它们会被放置在同一个桶中,形成链表或红黑树。
如果在插入或查找元素时,哈希函数计算出的索引位置出现错误,可能会导致链表或红黑树的循环引用,从而导致死循环。
此外,如果在多线程环境下,没有正确处理并发修改操作,也可能导致HashMap的死循环。为了避免这种情况,可以使用线程安全的ConcurrentHashMap或正确处理并发修改操作。
四、hashset线程安全吗
非线程安全
Collection、ArrayList、HashMap、HashSet都是非同步的,线程不安全的
感谢您花时间阅读本文!我们希望通过对hashmap为什么线程不安全的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。