后台-插件-广告管理-内容页广告位一(手机)

您现在的位置是:首页 > 网络安全 > 安全教程安全教程

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

2021-06-05 09:11:11安全教程人已围观

简介HashMap的线程不安全问题JDK1.7JDK1.8JDK1.71》JDK1.7是头插法,导致死循环先看源码1)步骤一2)步骤二3)步骤三4)步骤四JDK1.82》JDK1.8是尾插法,会有数据覆盖问题这是jdk1.8中HashMap中put操作的主函数,注意第6行代码,如果没有hash碰撞则会直接插入元素。如果线程A和线程B同时进行put操作,刚好这两条不同的数据hash值一样,并且该位置数据为null,所以这线程A、B都会进入第6行代码中。假设一种情况,线程A进入后还

HashMap的线程不安全问题

  • JDK1.7
  • JDK1.8

JDK1.7

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

先看源码在这里插入图片描述
1)步骤一
在这里插入图片描述

2)步骤二
在这里插入图片描述

3)步骤三
在这里插入图片描述

4)步骤四

在这里插入图片描述

JDK1.8

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

文章来源:https://blog.csdn.net/qq_50563889/article/details/117536550

Tags:hashmap java 多线程 

很赞哦! ()

后台-插件-广告管理-内容页广告位二(手机)

相关文章

后台-插件-广告管理-内容页广告位三(手机)

随机图文

后台-插件-广告管理-内容页广告位四(手机)

文章评论

留言与评论(共有 0 条评论)
   
验证码:

本栏推荐

站点信息

  • 文章统计60041篇文章
  • 浏览统计4401次浏览
  • 评论统计1个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信公众号:扫描二维码,关注我们