面试官脑子有病系列:为什么 HashMap 是线程不安全的?

在这里插入图片描述

文章目录

  • 前言
  • HashMap为啥线程不安全?
  • HashMap线程不安全的根本原因
    • put 方法中的非原子性操作
    • 扩容时的非原子性操作
  • 安全的HashMap
  • 总结

前言

Hi,大家好,我是王二蛋。

我们在面试的时候,经常会被问到一些有的没的、看似高深但与日常工作关系不大的问题。也因此被大家调侃为“面试造火箭,工作拧螺丝”。

今天就来探讨一个在Java面试时经常被问到的一个问题:为什么 HashMap 是线程不安全的?

HashMap为啥线程不安全?

估计HashMap听到这个问题都会骂一句:

HashMap 内心OS:我一个数据结构为啥要线程安全?

不过他既然喜欢问,咱就答给他看。

对HashMap不了解的小伙伴,先简单了解一下:HashMap本身并不具备线程安全,如果在多线程的情况下没有采取同步措施,直接对其进行修改操作,就可能会引发线程安全问题。

接下来看看,到底是什么情况下会出现线程安全问题。

HashMap线程不安全的根本原因

HashMap 的不安全主要是内部的修改不是原子操作。主要涉及以下几个操作:

  1. put 方法中的非原子性操作。
  2. 扩容时的非原子性操作。

put 方法中的非原子性操作

在 HashMap 的 put 方法中,会涉及到多个步骤,包括计算键的哈希值、找到对应的桶、处理哈希冲突等。这些步骤在没有外部同步的情况下不是原子的,所以在多线程并发时可能会出现问题。

假设有两个线程 A 和 B 同时尝试 put 同一个键到 HashMap 中:

  1. 线程 A 计算了哈希值并找到了对应的桶。
  2. 线程 B 在线程 A 还未完成 put 操作时,也计算了相同的哈希值并尝试修改同一个桶。
  3. 如果线程 A 在线程 B 修改桶之后才完成 put 操作,那么线程 B 的修改可能会被线程 A 的操作覆盖,从而导致数据丢失。

扩容时的非原子性操作

当 HashMap 中的元素数量超过阈值时,会触发扩容操作。扩容涉及到以下几个步骤:

  1. 创建一个新的数组。
  2. 重新计算所有键的哈希值。
  3. 将原数组中的元素迁移到新数组中。

这个过程也是非原子的,所以在多线程并发时也可能会出现问题。

假设有两个线程 A 和 B:

  • 线程 A 检测到 HashMap 需要扩容,并开始创建新的数组。
  • 线程 B 在线程 A 完成扩容之前,向 HashMap 中添加了一个新的元素。
  • 线程 A 完成扩容后,可能没有考虑到线程 B 添加的新元素,从而导致数据丢失。

安全的HashMap

尽管HashMap存在线程安全问题,但在非并发修改的场景中,它依然是性能最优的键值对存储选择。

当然,如果确保线程安全,我们有其他选项。比如使用ConcurrentHashMap或通过Collections.synchronizedMap将普通HashMap转化为线程安全的Map。

总结

HashMap开发时使用率是非常高的,面试官问这个问题主要是考察对数据结构理解、对线程安全的掌握以及有没有高并发项目的经验。所以,在平时的工作中要多思考、多观察,做到知其然知其所以然。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528791.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科技型中小企业怎么做

在当今快速发展的科技时代,科技型中小企业扮演着越来越重要的角色。这些企业不仅推动了技术创新,还为经济增长和社会进步做出了巨大贡献。那么,科技型中小企业应如何制定并执行其发展战略呢? 1. 明确定位与战略规划 对于任何企业…

SD-WAN为出海电商提供了什么支持

出海电商行业的持续发展与壮大,使得网络连接的稳定性和效率成为其成功的关键因素。SD-WAN(软件定义广域网)作为一种先进的网络解决方案,为出海电商提供了诸多优势和支持。 首先,SD-WAN通过智能路由技术,能够…

华火电焰灶测评:电焰灶十大品牌哪个好?实力排名怎么样?

华火新能源电焰灶作为现代厨房技术的一大创新,近年来受到了广泛关注。在新能源电焰灶市场中,目前只有华火品牌具有独立研发、独立生产、品质背书、完善服务等雄厚的综合实力;而华火品牌凭借其独特的技术和优势,与其他传统燃气灶品…

EDM邮件群发推广多少钱?有哪些优势?

电子邮件营销(Electronic Direct Mail, EDM)以其高性价比、精准定向与可度量效果的优势,成为众多企业不可或缺的营销策略。云衔科技,作为企业数字广告营销和SaaS软件服务的领军者,以其创新的智能EDM邮件营销系统解决方…

2024 工业物联网通信与网络安全国际学术会议(IIOTNS 2024)

【会议英文官网】:www.iiotns2024.org 【会议时间】: 2024年5月10-12日 【一轮截稿时间】: 2024年3月10-12日 所有于一轮截稿时间之前投稿,后续通过审核并被大会录用的稿件享早鸟优惠:单篇立减400元!&am…

如何快速识别陶瓷件的外观缺陷吗?

陶瓷件由陶瓷材料制成的物品或零部件,通常用于装饰、日常生活用品、工艺品或工业应用。陶瓷是一种非金属材料,具有耐高温、耐磨损、绝缘、化学稳定等特性,因此在许多领域得到广泛应用。 本案针对陶瓷件尺寸长25mm*宽11mm*高2mm的产品的外观检…

HarmonyOS 应用开发-ArkUI事件机制

ArkUI提供了事件机制,这些事件提供了不同的信息用于处理程序交互逻辑,ArKUI事件按照功能来讲,可以分为以下几种: 点击事件触摸事件挂载卸载事件拖拽事件按键事件焦点事件鼠标事件组件区域变化事件组件可见区域变化事件组件快捷键…

C++ primer 第十八章

C语言的三大特性:异常处理、命名空间、多重继承。 1.异常处理 异常处理机制允许我们能够将问题的检测与解决过程分离开来。 1.1、抛出异常 在C语言中,我们通过抛出一条表达式来引发一个异常。 当执行一个throw时,程序的控制权从throw转移…

T527 Qt 触摸 ----- TSLIB

一、调试 1、驱动路径 bsp/drivers/input/ctp/gt9xx/gt9xx_ts.c 2、硬件接口 挂载在TWI0下 3、中断复位脚 4、设备树 &twi0 {clock-frequency <400000>;pinctrl-0 <&twi0_pins_default>;pinctrl-1 <&twi0_pins_sleep>;pinctrl-names &quo…

SpringBoot 定时任务实践、定时任务按指定时间执行

Q1. springboot怎样创建定时任务&#xff1f; 很显然&#xff0c;人人都知道&#xff0c;Scheduled(cron ".....") Q2. 如上所示创建了定时任务却未能执行是为什么&#xff1f; 如果你的cron确定没写错的话 cron表达式是否合法&#xff0c;可参考此处&#xff0c…

MAC苹果电脑如何使用Homebrew安装iperf3

一、打开mac终端 找到这个终端打开 二、终端输入安装Homebrew命令 Homebrew官网地址&#xff1a;https://brew.sh/ 复制这个命令粘贴到mac的终端窗口&#xff0c;然后按回车键 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/in…

ModuleNotFoundError: No module named ‘ultralytics.utils‘

项目场景he 问题描述 提示&#xff1a;这里简述项目相关背景&#xff1a; model YOLO(modelr./yolov8m-cls.pt) 加载预训练模型时报错。 ModuleNotFoundError: No module named ultralytics.utils warning: bug: 原因分析&#xff1a; 很可能是提前下载的预训练模型出了…

川川本人著作《Python3编程从零基础到实战》

在数字时代&#xff0c;Python已经成为了一种极为强大和灵活的编程语言&#xff0c;它的应用范围从网站开发到数据科学&#xff0c;再到机器学习和人工智能。无论你是一名编程新手还是希望深化已有技能的开发者&#xff0c;《Python3编程从零基础到实战》将成为你通往Python世界…

css面试题---场景应用

1、实现一个三角形 css一般用border属性实现三角形。 div {width: 0;height: 0;border: 100px solid;border-color: orange blue red green; } // 三角形一 div {width: 0;height: 0;border-top: 50px solid red;border-right: 50px solid transparent;border-left: 50px soli…

SAP HCM 0000与0001信息类型不一致导致 DUMP解决方案

今天遇到一个很奇怪的问题&#xff0c;就是执行PA20与工资核算的时候&#xff0c;系统down掉&#xff0c;不知道什么问题&#xff0c;后来想想遇到这样标准程序界面down掉&#xff0c;无非就是数据问题&#xff0c;增强问题。所以就需要向这个方向靠&#xff0c;HCM核心的信息类…

线性、逻辑回归算法学习

1、什么是一元线性回归 线性&#xff1a;两个变量之间的关系是一次函数&#xff0c;也是数据与数据之间的关系。 回归&#xff1a;人们在测试事物的时候因为客观条件所限&#xff0c;求的都是测试值&#xff0c;而不是真实值&#xff0c;为了无限接近真实值&#xff0c;无限次的…

【自然语言处理八-transformer实现翻译任务-一(输入)】

自然语言处理八-transformer实现翻译任务-一&#xff08;输入&#xff09; transformer架构数据处理部分模型的输入数据(图中inputs outputs outputs_probilities对应的label)以处理英中翻译数据集为例的代码 positional encoding 位置嵌入代码 鉴于transfomer的重要性&#xf…

java——网络编程

什么是计算机网络 把分布在不同地理区域的计算机设备&#xff0c;通过通信设备和线路(网线&#xff0c;光纤&#xff0c;交换机)连接&#xff0c;最终实现数据的传输和资源的共享。 实现不同计算机之间的联系&#xff0c;必须有介质连接 最早的网络&#xff1a;美国五角大楼一…

Go语言不能常量取址!?

题如下图 在软件开发中&#xff0c;常量是一种重要的编程元素&#xff0c;它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中&#xff0c;常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如&#xff1a; const a …

WinRAR功能之【锁定压缩文件】

今天来分享一下WinRAR解压缩软件的“锁定压缩文件”功能&#xff0c;这个功能可以保护压缩包里文件的完整性&#xff0c;也就是不能随意增加、删除以及修改压缩包里的文件。我们可以用两种方式来设置&#xff0c;一起来看看吧&#xff01; 方式1&#xff1a;在压缩文件的时候&a…