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

HashMap的线程不安全问题

  • JDK1.7
  • JDK1.8

JDK1.7

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

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

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

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

4)步骤四

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

JDK1.8

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

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

这是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就不用进行排队处理,从而提高了程序执行的效果。(分段锁:锁粒度小,性能高)

你可能感兴趣的:(面试,hashmap,java,多线程)