• 和记娱乐官方网站

  • 和记百科

  • 娱乐

  • 体育

  • 摄影

  • 和记问答
  • 为什么说hashmap是线程不安全的,请问hashmap为什么

    主页 > 和记问答 > 2023-12-26 13:40

      为什么说hashmap是线程不安全的,请问hashmap为什么是线程不安全的?

      最近有很多热心网友都十分关心为什么说hashmap是线程不安全的,请问hashmap为什么是线程不安全的?这个问题。还有一部分人想了解为什么说hashmap是线程不安全的。对此,和记百科小编「萌你一身血」收集了相关的教程,希望能给你带来帮助。

      

    hashmap为什么是线程不安全的

     

       演示机型:华为MateBook X系统版本:win10

      1、JDK1.7中,由于多线程对HashMap进行扩容,调用了HashMap,当某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。

      2、JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap,假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,从而线程不安全。

      

    为什么说hashmap是线程不安全的

     

      1、HashMap线程不安全原因: 原因: JDK1.7 中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。

      2、JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程

      

      【英文介绍/For English】:

      

       Demonstration model: Huawei MateBook X

      System version: win10

      1. In JDK1.7, due to the multi-thread expansion of HashMap, HashMap is called. When a thread is suspended during execution, other threads have completed data migration, and the suspended thread is re-executed after CPU resources are released. In the previous logic, the data has been changed, resulting in an infinite loop and data loss.

      2. In JDK1.8, HashMap is called due to the multi-thread put operation on HashMap. It is assumed that both threads A and B are performing put operations, and the insertion subscript calculated by the hash function is the same. When thread A executes After finishing the sixth line of code, it is suspended due to the exhaustion of the time slice, and thread B inserts an element at the subscript after getting the time slice, and completes the normal insertion, and then thread A obtains the time slice, because it has been done before. The judgment of hash collision will not be judged at this time, but will be inserted directly, which will cause the data inserted by thread B to be overwritten by thread A, making the thread unsafe.

    上一篇:玉兔代表什么数字,请问玉兔东升是什么意思? 下一篇:煮河蟹是用热水还是凉水!蟹子热水煮还是凉水

    热门阅读

    友情链接