HashMap有哪些线程安全的处理方式(面试题)

news2024/7/4 5:41:50

HashMap有哪些线程安全的处理方式(面试题)

  • 概念
  • 1. synchronizedMap(Map<K,V> m)
  • 2. ConcurrentHashMap
  • ConcurrentHashMap Jdk1.7 vs Jdk1.8

在这里插入图片描述

概念

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null
之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。

1. synchronizedMap(Map<K,V> m)

   public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
        return new SynchronizedMap<>(m);
    }

在Java.utils.Collections类中,提供了synchronizedMap静态方法,返回一个新的线程安全的Map实例。其实不光Map,Collection、List、Set的所有子类也支持此方式来提供线程安全的容器。

通过源码不难发现,在Collections类中定义了静态内部类,以Map为例,synchronizedMap返回的其实是java.util.Collections.SynchronizedMap类型,其所有原Map定义的方法均添加了synchronized关键字,这个做法很HashTable比较类似。在保证线程安全的同时,性能下降明显。

2. ConcurrentHashMap

java.util.concurrent.ConcurrentHashMap为HashMap的线程安全版,将原Map拆分成多个独立的Segment(通过继承ReentrantLock来进行加锁),通过锁住独立的Segment来降低锁的粒度,在高并发的情况下尽可能减少锁冲突。这样的设计需要二次定位,即先对key对应的Segment定位,再定位hash值对应的数据下标。在JDK1.8后,对ConcurrentHashMap锁机制进行优化,采用Node + CAS + synchronized,摒弃了Segment的概念,进一步缩小了锁的粒度。

下面简易对比一下ConsurrentHashMap在JDK1.7和1.8中的差异

ConcurrentHashMap Jdk1.7 vs Jdk1.8

jdk版本1.71.8
底层实现数组+链表数组+链表 / 红黑树
数据结构Segment 数组 + HashEntry 节点Node 节点
分段锁,默认并发是16,一旦初始化,Segment 数组大小就固定,后面不能扩容CAS + synchronized 来保证并发安全性
put 操作先获取锁,根据 key 的 hash 值 定位到 Segment ,再根据 key 的 hash 值 找到具体的 HashEntry ,再进行插入或覆盖,最后释放锁根据 key 的 hash 值 定位到 Node节点,再判断首节点是否为空,空的话通过 cas 去赋值首节点 ; 首节点非空的话,会用 synchronized 去锁住首节点,并判断是是同个首节点,是的话再去操作
释放锁需要显示调用 unlock()不需要

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字孪生3D可视化技术在数字化水利行业中的应用

城市供水数字孪生系统是一种基于web3d开发和数字孪生技术构建的智能运维系统&#xff0c;它可以将实际设备与虚拟模型相结合&#xff0c;实现对城市供水系统的实时监测、预测和优化。 智慧供水系统是智慧水务建设的新目标与新高度&#xff0c;能够实现城市内部原水供水以及污水…

ASEMI单向可控硅BT169D参数,BT169D规格,BT169D大小

编辑-Z 单向可控硅BT169D参数&#xff1a; 型号&#xff1a;BT169D 断态重复峰值电压VDRM&#xff1a;600V 平均通电电流IT(AV)&#xff1a;0.6A R.M.S通电电流IT(RMS)&#xff1a;0.8A 通态浪涌电流ITSM&#xff1a;10A 平均栅极功耗PG(AV)&#xff1a;0.1W 峰值门功率…

Curl【实例 01】curl下载使用及cmd实例脚本分享(通过请求下载文件)

Curl 官方下载地址 可下载不同平台不同版本的安装包。 这里写目录标题 1.是什么1.1 curl1.2 bat和cmd 2.常用命令2.1 发送GET请求并显示响应头信息2.2 显示详细的请求和响应信息2.3 限制重定向次数2.4 带Json数据的Post请求发送2.5 带文件的Post请求发送2.6 使用代理服务器发送…

付费订阅故事难讲,腾讯音乐如何“过河”?

作者 | 艺馨 豆乳拿铁 排版 | Cathy 监制 | Yoda 出品 | 不二研究 腾讯音乐如何“过河”&#xff1f; 近日&#xff0c;腾讯音乐娱乐集团&#xff08;下称“腾讯音乐”&#xff0c;01698.HK&#xff09;公布了2022全年及2023年一季度财报。 腾讯音乐是一家提供在线音乐及…

使用 LangChain 和 Elasticsearch 的隐私优先 AI 搜索

作者&#xff1a;Dave Erickson 在过去的几个周末里&#xff0c;我一直在 “即时工程” 的迷人世界中度过&#xff0c;并了解像 Elasticsearch 这样的矢量数据库如何通过充当长期记忆和语义知识存储来增强像 ChatGPT 这样的大型语言模型 (LLM)。 然而&#xff0c;让我和许多其他…

波奇学STL:String入门和迭代器

目录 ​编辑 Constructor/Destructor/Operator Constructor:构造函数 Iterator:迭代器 begin()/end():迭代器像指针一样访问问函数 个人对迭代器的理解 rbegin()/rend():迭代器反向移动 除了用迭代器访问元素外string类还可以[]下标 Capacity:容量&#xff1f; s.siz…

Hystrix入门使用 服务熔断 服务降级 服务雪崩

一、概念 hystrix停止更新&#xff0c;理念优秀。 分布式系统面临的问题: 对于复杂的分布式体系&#xff0c;有数十个依赖&#xff0c;依赖不可避免的错误。 服务会出现雪崩&#xff0c;高可用受到破坏。 Hystrix就是用于解决分布式系统延迟和容错的开源库。 保证在一个依赖出…

Python五彩气球

文章目录 前言Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字 五彩气球气球类漂浮函数气球函数六一祝福 尾声 前言 六一要来啦&#xff0c;快来领取博主精心准备的五彩气球吧&#xff01; Turtle基础 小海龟(Turtle)是Python中画图的一…

SpringBatch历史数据的清理方案及实现

SpringBatch历史数据的清理方案及实现 需求背景 SpringBatch的程序已经运行了将近一年&#xff0c;数据量已经达到了一定的数据量级别。 对SpringBatch历史数据的清理也被提上日程。 但是SpringBatch的代码中似乎没有找到清理历史数据的代码&#xff0c;在官方文档中也没有…

一、STM32程序下载软件_FlyMCU

1、软件简介 (1)FlyMCU是一款STM32下载程序的软件。 (2)FlyMCU采用ISP下载方式。 (3)ISP&#xff1a;在线系统编程。 (4)FlyMCU支持STM32F1、STM32F2、STM32F4系列&#xff0c;其他暂不支持&#xff0c;后续应该也不会更新了。 (5)STM32芯片的ISP下载&#xff0c;只能使用…

LINUX系统编程-----中

文章目录 进程间的通信管道popen 和 pclosepipeFIFO 共享内存system V 版本的共享内存创建/获取共享内存 共享内存涉及的函数共享内存的通信两个进程同时对共享内存进行读写 信号量使用信号量保护共享资源消息队列死锁 信号内核不可中断状态 进程间的通信 管道 在操作系统中&…

【备战秋招】每日一题:4月1日美团春招(二批)第三题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

Electron简单开发

文章目录 1.参考网站2.HelloWold编写2.1新建空文件夹2.2node初始化2.3安装electron依赖2.4添加.gitignore 文件2.5创建main.js文件和index.html2.6运行electron应用 3.打包 接到一个任务&#xff0c;将electron集成到solidworks中&#xff0c;所以记录一下electron的简单操作&a…

【操作系统】05.文件管理

文件管理 文件的属性 文件内部数据的组织 文件之间的组织 操作系统向上层提供功能 创建文件 删除文件 打开文件 关闭文件 读文件 写文件 文件的逻辑结构 无结构文件 有结构文件 顺序文件 文件的物理结构 磁盘块&#xff08;文件块&#xff09; 连续分配 优点 对于机…

操作系统 四、文件管理

文章目录 4.1 文件的逻辑结构4.2 文件目录4.2.1 目录结构4.2.1.1 单级目录结构4.2.1.2 两级目录结构4.2.1.3 多级目录结构4.2.1.4 无环图目录结构 4.2.2 索引结点(FCB的改进) 4.3 文件的物理结构4.3.1 连续分配4.3.2 链接分配4.3.2.1 隐式链接4.3.2.2 显式链接 4.3.3 索引分配 …

稠密点云获取方法(二)

作为高分辨率三维重建的方法之一,从单张图像生成稠密三维点云在计算机视觉领域中一直有着较高的关注度。 以下文献提出了一种针对二维和三维信息融合的方法以解决三维点云稀疏难以检测远处的目标的问题。 Multimodal Virtual Point 3D Detection 该文献提出一种将 RGB 传感器…

【Mysql】| 超详细常见bug及解决方案

目录 一. &#x1f31f; 引入话题二. &#x1f31f; 引出bug1.1 查看bug1.2 Problem Solving2.1 查看bug2.2 Problem Solving3.1 字段长度异常3.2 Problem Solving 三. &#x1f31f; 最后 一. &#x1f31f; 引入话题 MySQL是一款广泛使用的开源数据库管理系统&#xff0c;它…

小白了解Docker容器技术

一、什么是Docker&#x1f451; 有一个最常见的例子来很好的帮我们简单了解Docker容器技术&#xff1a; 当我们在一台计算机中配置好了环境&#xff0c;花费了极大的时间和精力成功开发部署好了一个应用。准备尝试在不同操作系统、不同环境下部署这个应用时&#xff0c;我们需要…

图及其与图相关的算法

⭐️前言⭐️ 本篇文章主要介绍图及其与图相关的算法 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主…

如何在 Rocky Linux 上检查磁盘空间?

在 Rocky Linux 上检查磁盘空间是系统管理和维护的重要任务之一。磁盘空间的监控和管理可以帮助我们及时发现和解决存储空间不足的问题&#xff0c;以确保系统的正常运行。本文将详细介绍在 Rocky Linux 上检查磁盘空间的方法。 方法 1&#xff1a;使用 df 命令 df 命令是 Li…