Java面试题:ConcurrentHashMap

ConcurrentHashMap

一种线程安全的高效Map集合

jdk1.7之前

底层采用分段的数组+链表实现

请添加图片描述

一个不可扩容的数组:segment[]

数组中的每个元素都对应一个HashEntry数组用以存放数据

当放入数据时,根据key的哈希值找到对应的segment数组下标

找到下标后就会添加一个reentrantlock来上锁

并发情况下,多个线程使用cas的方式来尝试获取锁

同时只有一个线程来操作HashEntry数组的数据

每次上锁锁住整个HashEntry数组

性能较低,但线程安全

jdk1.8之后

底层采用数据结构和HashMap一样,数组加链表/红黑树的结构

放弃了segment的设计

底层采用了CAS+Synchronized的方式来保证并发的安全问题

CAS来控制节点的添加,同一时间只能添加一个数据

Synchronized锁定链表和红黑树的头结点,只要hash不冲突,就不会产生并发问题,提升效率

一个下标下的头结点被锁住不会影响其他的下标

每次只锁住一颗树/链表

影响范围小,分段锁精度更好,性能更好

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试框架怎么选?Robot Framework怎么搭建环境?

本系列文章跟大家分享的内容是Robot Framework从入门到实践的整个过程,首先会简单为大家介绍一下自动化测试框架,包括框架选择、环境搭建、接口自动化等,最后会带大家实际操作一遍,本文我们主要为大家介绍自动化测试框架的不同以及…

c++ 各版本特性介绍

c C是一种高级编程语言,以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的,作为C语言的一个扩展。C不仅包含了C语言的所有特性,还引入了面向对象编程(OOP)的概念&…

Echarts结课之小杨总结版

Echarts结课之小杨总结版 前言基础回顾框架sale框架代码: user框架基础代码: inventory框架基础代码: total框架基础代码: 基础设置1.标题(Title)2.图例(Legend)实现 3.工具提示(Tooltip)实现 4.X轴(X Axis) 和 Y轴(Y Axis)5.数据…

洗地机哪款好用?希亦、追觅、顺造、米家等高品质洗地机推荐

家用洗地机已经成为家庭清洁的重要利器,其多功能性能帮助您轻松应对各种清洁任务,从而保持家居环境的清洁整洁。然而,市场上品牌繁多、功能各异的洗地机让人眼花缭乱。为了帮助大家做出明智的选择,我们将在本文中提供全面的选购指…

linux安装Openresty

安装必要的依赖库 指定仓库地址 下载openresty 添加环境变量 vi /etc/profile i export NGINX_HOME/usr/local/openresty/nginx/ export PATH${NGINX_HOME}/sbin:$PATH esc :wq source /etc/profile #启动 nginx # 重启 nginx -s reload #关闭 nginx -s stop

vue获取路由的值

1,此方法获取到请求地址后面的值 如 /name123&age12 2,此方法获取到请地址?后面的值 例如?name123&age12 二者的区别,第一个是直接在路径后面拼接,第二种就是正规的http请求。 路径带?号的

sql实践

1.从excel导入数据 在excel导入数据时要先在数据库中创建对应的数据库表 CREATE TABLE your_table_name (crawl_datetime DATE,url CHAR(255),company_name CHAR(255),company_size CHAR(255),company_type CHAR(255),job_type CHAR(255),job_name CHAR(255),edu CHAR(255),e…

idea控制台日志控制

1.清除控制台log日志 测试的时候,控制台打印的日志比较多,速度有点慢而且不利于查看运行结果,所以接下来我们把这个日志处理下: 取消初始化spring日志打印,resources目录下添加logback.xml,名称固定,内容如…

springboot月度员工绩效考核管理系统

摘要 本月度员工绩效考核管理系统采用java语言做为代码编写工具,采用mysql数据库进行系统中信息的存储与处理。框架采用springboot。 本系统的功能分为管理员和员工两个角色,管理员的功能有: (1)个人中心管理功能&am…

平地惊雷,GPT-4o 凌晨震撼发布

GPT-4o 今日凌晨,OpenAI 2024 年春季发布会召开,OpenAI 通过短短 28 分钟的发布会,发布了「再次震惊世界」的 GPT-4o,其中 o 是指 omni(全能)的意思。 一款「全新交互(支持 文本/音频/视频 组合…

PuLID: 图像背景、光线、风格等均保持高度一致图像生成工具,附本地一键包

PuLID是一种无需调优的ID定制方法。PuLID保持了高的ID保真度,同时有效地减少了对原始模型行为的干扰。 只需要提供一张照片,就可以生成高还原度的各种风格的图像。 使用方法:解压一键包,双击一键启动 点击ID图像(主…

《Python编程从入门到实践》day28

# 昨日知识点回顾 安装Matplotlib 绘制简单的折线图 # 今日知识点学习 15.2.1 修改标签文字和线条粗细 # module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? # 解决办法:matplotlib切换图形界面显示终端TkAgg。 #…