图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)

HashMap的线程不安全问题

JDK1.7

1》JDK1.7是头插法,导致死循环

先看源码图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)
1)步骤一
图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)

2)步骤二
图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)

3)步骤三
图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)

4)步骤四

图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)

JDK1.8

2》JDK1.8是尾插法,会有数据覆盖问题

图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8)

这是jdk1.8中HashMap中put操作的主函数,
注意第6行代码,如果没有hash碰撞则会直接插入元素。如果线程A和线程B同时进行put操作,刚好这两条不同的数据hash值一样,并且该位置数据为null,所以这线程A、B都会进入第6行代码中。假设一种情况,线程A进入后还未进行数据插入时挂起,而线程B正常执行,从而正常插入数据,然后线程A获取CPU时间片,此时线程A不用再进行hash判断了,问题出现:线程A会把线程B插入的数据给覆盖,发生线程不安全。

3》解决线程不安全:

1)HashTable(线程安全,但是缺点是整体给对象加锁)
2)ConcurrentHashMap(实现线程安全是在进行修改操作的时候(put),会在进入方法后加锁,并且在操作完成后释放锁)

对ConcurrentMap优化

是将HashMap分为多个sengment对每个sengment分别进行加锁,这样就可以保证,多线程如果操作的不是同一个sengment就不用进行排队处理,从而提高了程序执行的效果。(分段锁:锁粒度小,性能高)

版权声明:玥玥 发表于 2021-06-05 3:55:17。
转载请注明:图解面试中常问的HashMap的线程不安全问题(JDK1.7&JDK1.8) | 女黑客导航