当前位置: 首页 > news >正文

HashMap之线程安全问题

我们知道Java8采用的尾插法来代替Java7的头插法,而这种头插法改为尾插法能解决并发状态下,HashMap出现死循环的问题。那么我们现在就来讨论一下为什么HashMap在多线程下是不安全的。

HashMap并发安全问题主要有数据覆盖问题扩容时死循环

一.数据覆盖问题

JDK7和JDK8都存在这个问题。例如:

  • JDK7中A,B线程同时执行put操作时,两个key都指向一个bucket.此时两者都会进行头插法。
  • 当A,B都获取到bucket上的头结点时,如果此时A的时间片(时间片轮转法)用完了,线程B便先头插,此时A有时间片了,也准备开始头插
  • 但是此时A持有的仍然是老的那个头结点,并没有更新,此时他还以为老的那个头结点仍然存在,于是插入,便覆盖了B的数据
void createEntry(int hash, k key,v value, int bucketIndex){//获取bucket上的头节点Entry<K,v>e= table[bucketIndex];//将新结点作为新的头结点 table[bucketIndexl=new Entry<>(hash, key, value,e);size++;}

Java8的尾插法也涉及到这个问题,所以Java8是为了解决扩容导致死循环的问题

二.扩容导致死循环

有一篇文章写的特别清晰,详情跳转该文章看扩容如何导致死循环:

java关于HashMap多线程扩容导致死循环(JDK1.7)的详细过程

扩容导致死循环的面试简要回答:

一个线程已经完成扩容,此时链表倒置,另一个线程还停留在获取到原头结点及其next语句,而next语义失效,继续执行将导回原头结点,形成死循环

http://www.dtcms.com/a/475098.html

相关文章:

  • 网站安全建设方案报告gta5显示网站建设中
  • Python学习AI大模型:零基础快速入门指南
  • WebRTC获取GB28181监控摄像头实时音视频流的实现方法
  • 深入剖析:C++、C 和 C# 中的 static
  • 做电商要关注哪些网站临沂网站建设排名
  • 带条件的排名问题
  • 2025 诺贝尔物理学奖 | 从宏观量子隧穿到量子计算
  • 怎么做网站 有空间wordpress 弹性布局设计案例
  • LDPC 码基本概念
  • 在线考试响应式网站模板下载学校如何报销网站开发费用
  • 可以建微信网站的成考做那个网站的题比较好
  • 2025年推荐练习编程游戏和软件
  • 【HarmonyOS】手势处理
  • 学做缝纫的网站wordpress网站换主机
  • 葫芦岛做网站价格免费手机网站系统
  • PS2020使用教程|绘制深秋枫叶风景图
  • 济南建网站多少钱设计说明室内设计现代简约
  • Go语言 编写最简单的命令行工具
  • 【指针学习】
  • Go容器:双向链表和小根堆的源码解读
  • 深圳vi设计工作室搜索seo优化托管
  • 做的最好的理财网站地址一地址二在线发布页
  • 网站开发程序员招聘梅州建站怎么做
  • 普陀酒店网站建设有没有专门做中式的设计网站
  • 基于STM32与influxDB的电力监控系统-20
  • 购物网站开发多少钱免费连网络的软件有哪些
  • LeetCode算法日记 - Day 69: 第 N 个泰波那契数、三步问题
  • 【系统分析师】写作框架:项目风险管理及其应用
  • 容器编排大王Kubernetes——控制器的使用(3)
  • 建筑设计图保定seo网络推广