ConcurrentHashMap 常见面试题详解

2023-11-18

ConcurrentHashMap

1. ConcurrentHashMap的数据结构

数组 + 链表, 采用了分段锁的实现机制

2. ConcurrentHashMap初始化

首先会创建segment数组,长度为默认(16)或传入的并发值的大于等于的2的次方数,不可扩容
初始化(s0)segment对象并保存,并初始化他的属性,创建一个entry数组,entry数组初始化长度为 (容器长度 / segment数组长度)
    大于等于2的次方,在下一次进行添加数据的时候,会直接取这个s0对象
这里初始化了他的segment[0]

3. ConcurrentHashMap如何存取数据的

1.7:
    put():
        1.先计算出key值的hash值,然后通过hash值(对segment[]进行取余)找到数组中对应的segment对象
        2.尝试获取锁,失败则自旋保证成功。
        3.获取锁,然后通过计算出的hash值(对hashentry[]进行取余)找出对应的entry对象
        	遍历链表中,查找有没有相同key值对象
            有: 旧值覆盖新值
            没有: 添加到链表中(1.7/头部  |  1.8/尾部)
    get():
        1.通过key值的hash值定位到对应segment对象,再通过hash值定位到具体的entry对象
        2.遍历链表,通过equals取出数据
        3.由于 HashEntry 中的 value 属性是用 volatile 关键词修饰的
        	保证了内存可见性,所以每次获取时都是最新值
        4.整个过程不需要加锁

1.8:
	put():
		1.根据 key 计算出 hashcode
		2.判断是否需要进行初始化。
		3.即为当前 key 定位出的 Node,如果为空表示当前位置可以写入数据
		4.利用 CAS 尝试写入,失败则自旋保证成功。如果都不满足,则利用 synchronized 锁写入数据
		5.如果数量大于 树形化阈值 则要转换为红黑树。
	get():
		1.根据计算出来的 hashcode 寻找segment,如果就在桶上那么直接返回值。
		2.如果是红黑树那就按照树的方式获取值。
		3.就不满足那就按照链表的方式遍历获取值。
	

4. 1.7、1.8 实现有何不同?为什么这么做?

线程同上.

数据结构:
	1.7: 数组 + 链表
	1.8: 
		1.7的底层还是链表,在查询数据的时候需要遍历,导致效率很低
		1.8和HashMap比较像,也引入了红黑树,把值和next采用了volatile去修饰,保证了可见性

5. volatile的特性是啥?

volatile是Java提供的一种轻量级的同步机制:
	1.保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值
		这新值对其他线程来说是立即可见的。(实现可见性)
	2.禁止进行指令重排序。(实现有序性)
	3.volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。

6. ConcurrentHashMap 线程安全怎么做的?

1.7:
	采用了分段锁的机制,当一个线程占用锁时,不会影响到其他的Segment对象
1.8:
	抛弃了原来的分段锁,采用了 CAS 和 synchronized 来保证并发的安全

7. 不安全会导致的问题


8. CAS是啥?ABA是啥?场景有哪些,怎么解决?

CAS:
	是乐观锁的一种实现方式,是一种轻量级锁
	线程在读取数据时不进行加锁,在准备写回数据时,比较原值是否修改,
	若未被其他线程修改则写回,若已被修改,则重新执行读取流程
ABA:
	当线程对值的修改过程中,另一个线程也对这个值进行了修改,并把它改为了原来的值
		此时,这个值已经不是和原的值了
    解决方案:
    	版本号 / 时间戳

9. synchronized锁升级策略

	1.先使用 偏向锁 优先同一线程然后再次获取锁
	2.如果失败,就升级为 CAS 轻量级锁,失败就会短暂自旋,防止线程被系统挂起。
	3.最后如果以上都失败就升级为重量级锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ConcurrentHashMap 常见面试题详解 的相关文章

  • 为什么 JavaFX API 不包含在 Java 8 J2SE 中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有谁知道为什么 JavaFX 8 仍然不是即将推出的 Java 8 中的日常 J2SE API 显示所有 Java 组件的技术图清楚地将 Jav
  • Hibernate 4 字节码增强不适用于脏检查优化

    我正在使用 Hibernate 4 3 6 并且我使用了最新的Maven 字节码增强 http vladmihalcea com hibernate 4 bytecode enhancement 使所有实体提高自我肮脏意识 我添加了mave
  • 在 Eclipse 中隐藏重复的工具栏项

    我不知道如何 但我的 STS 有重复的工具栏项目 我不知道如何删除它们 这是我复制的工具栏的样子 我想摆脱这些 我试图隐藏工具栏 但这没有帮助 有人知道如何删除重复的吗 自从升级到 Oxygen 以来 我一直遇到同样的问题 我无法可靠地重现
  • Java - 红、绿、蓝获取RGB

    通过致电getRGB int x int y with a BufferedImage对象 得到一个负数 如何将三个不同的值 红色 绿色和蓝色 转换为这个单个负数 使用颜色类 new Color r g b getRGB
  • 最终字段可能尚未/已经初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何处理抛出检查异常的静态最终字段初始值设定项 https stackoverflow com questions 1866770 how to handle a static final field
  • Java HashMap 嵌套泛型与通配符

    我正在尝试创建包含自定义类的不同子类的哈希集的哈希映射值的哈希映射 如下所示 HashMap
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • 无法将 INode 类型值分配给 类型变量。为什么?

    我想知道为什么以下代码无法工作 public static
  • 想要从java中的char数组创建字符流

    我想从 char 数组构造一个流以使用 java 8 功能 例如过滤器和映射 char list a c e Stream
  • 限制 JPQL 中的结果数量

    如何限制从数据库检索结果的数量 select e from Entity e I need only 10 results for instance 您可以尝试像这样给出 10 个要显式获取的结果 entityManager createQ
  • 外部实体更改后索引不更新

    我目前正在开发一个项目 使用 JPA 2 1 保存数据并使用 hibernate search 4 5 0 final 搜索实体 映射类和索引后 搜索工作正常 但是 当我更改值时描述B 类从 someStr 到 anotherStr 数据库
  • 如何从 Java 中“double”类型的值中删除小数值

    我正在调用一个名为 calculateStampDuty 的方法 它将返回 财产需缴纳的印花税金额 百分比计算有效 很好 并返回正确的值 15000 0 但是 我想显示该值 前端用户只是 15000 所以只想删除小数点和任何前面的值 此后
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 在 Java 中的 JFrame/JPanel/JComponent 中添加 Web 浏览器

    我正在开发一个 Java 应用程序 需要在应用程序中使用 Web 浏览器 我见过一些应用程序这样做 例如在同一应用程序中单击左侧面板中的提要并打开右侧面板中的链接时的 RSS 阅读器 我想实现类似的功能 在java中可以做到这一点吗 Jav
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • 乔达时间中两个日期之间的天数

    如何找到两次之间的天数差异乔达时间 http www joda org joda time DateTime http www joda org joda time apidocs org joda time DateTime html实例
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i

随机推荐

  • Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南

    亚马逊平台是美国最大的一家网络电子商务公司 亚马逊公司是1995年成立 刚开始只做网上书籍售卖业务 后来扩展到了其他产品 现在已经是全世界商品品种最多的网上零售商和第二互联网公司 亚马逊是北美洲 欧洲等地区的主流购物平台 亚马逊商品分类接口
  • Office Visio 2007安装教程

    哈喽 大家好 今天一起学习的是Visio 2007的安装 这是一个绘制流程图的软件 用有效的绘图表达信息 比任何文字都更加形象和直观 Office Visio 是office软件系列中负责绘制流程图和示意图的软件 便于IT和商务人员就复杂信
  • SpringCloud与Dubbo的比较

    目录 Dubbo 一 dubbo简介 二 dubbo组织架构图 三 dubbo的优势 SpringCloud 一 SpringCloud简介 二 SpringCloud组织架构 三 SpringCloud特点 四 Dubbo与SpringC
  • 共模电感(扼流圈)选型

    1 共模电感原理 在介绍共模电感之前先介绍扼流圈 扼流圈是一种用来减弱电路里面高频电流的低阻抗线圈 为了提高其电感扼流圈通常有一软磁材料制的核心 共模扼流圈有多个同样的线圈 电流在这些线圈里反向流 因此在扼流圈的芯里磁场抵消 共模扼流圈常被
  • Python:打包生成.pyc、.pyd文件

    目录 pyd文件是什么 1 环境 2 待编译文件hello py以及setup py文件 3 运行调试 4 写在最后 pyd文件是什么 pyd文件类似于DLL 一般用C C 语言编译而成 可用作模块导入Python程序中 pyd文件仅适用于
  • 使用Unity游戏引擎在IOS模拟器中运行的方法

    在Unity编译IOS程序时 在Unity导航栏菜单中选择Edit gt ProjectSettings gt Player 菜单项 选择IOS平台在下方SDK Version处选择运行设备为IOS模拟器 选择完毕后Build and Ru
  • 任意代码执行漏洞简介

    一 任意代码执行漏洞思维导图 代码执行漏洞的成因 应用程序在调用一些能够将字符串转换为代码的函数 例如php中的eval中 没有考虑用户是否控制这个字符串 将造成代码执行漏洞 代码执行漏洞的常用函数 PHP eval assert preg
  • springcloud整合Hystrix

    作用 1 服务降级 触发情况 程序运行异常 超时 服务熔断触发服务降级 线程池 信号量打满也会触发服务降级 2 服务熔断 直接拒绝访问 即使有正确的访问也会短路 3 服务限流 排队有序进行 构建服务 1 建module provider h
  • 希沃白板5使用方法

    一 获取白板 手机和电脑都下载希沃白板五5 二 使用白板制作课件 1 获取课件 制作课件 方法一 1 点击课件库 2 点击右上角齿轮完成教材选择 3 找到所需课件 4 点击右下角箭头翻看 觉得可以点击 限免获取 5 点击云课件 找到刚才获取
  • .Net Core Json序列化和反序列化以及自定义JsonConverter来转化特殊日期时间格式

    System Text Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 JSON 的功能 System Text Json 命名空间包含所有入口点和主要类型 System Text Json Serializa
  • ELK日志分析系统--Elasticserach安装

    ElK安装 安装es Elasticserach介绍 Elasticsearch是个开源分布式搜索引擎 提供搜集 分析 存储数据3大功能 特点有 分布式 零配置 自动发现 索引自动分片 索引副本机制 restful风格接口 多数据源 自动搜
  • 【Linux操作系统】【综合实验五 网络管理与通信】【更新中】

    文章目录 一 实验目的 二 实验要求 三 实验内容 四 实验报告要求 一 实验目的 要求了解和熟悉Linux网络客户 服务器管理模式 client server 与网络环境的配置 熟悉网络远程登录模式与TCP IP常见终端命令的使用 学会使
  • jmeter常见问题

    问题1 javax swing text BadLocationException Position not represented by view 解决方法 问题2 Could not instantiate class kg apc j
  • react项目中使用react-dnd实现列表的拖拽排序

    现在有一个新需求就是需要对一个列表 实现拖拽排序的功能 要实现的效果如下图 可以通过 react dnd 或者 react beautiful dnd 两种方式实现 今天先讲下使用react dnd是如何实现的 github地址 https
  • 1011 A+B 和 C

    给定区间 231 231 内的 3 个整数 A B 和 C 请判断 A B 是否大于 C 输入格式 输入第 1 行给出正整数 T 10 是测试用例的个数 随后给出 T 组测试用例 每组占一行 顺序给出 A B 和 C 整数间以空格分隔 输出
  • linux下更改文件的权限

    更改所属组 chgrp 语法 chgrp 组名 文件名 root localhost groupadd testgroup root localhost touch test1 root localhost ls l test1 rw r
  • SQL巧用表的自连接和运算符代替排序的几个例子

    MySQL巧用表的自连接和运算符代替排序的几个例子 目录 MySQL巧用表的自连接和运算符代替排序的几个例子 例1 SQL18 例2 SQL23 例3 SQL87 例1 SQL18 获取当前薪水第二多的员工的emp no以及其对应的薪水sa
  • Spring Boot项目的真实程序入口

    基于 spring boot start开发的项目 其程序入口并不是我们开发的业务代码中定义了 main 函数的类 而是 Spring Boot 定义的 JarLauncher 类 下文源码反编译自 spring boot loader 1
  • 遇到bug我们如何分析定位?

    前言 日常工作中 每天可能都会遇到不同的bug 有些刚入行的测试喜欢不加分析就直接甩给开发去解决 开发比较闲还好 如果手头工作比较多 就容易烦 甚至有可能是后端的问题 但是你却把问题丢给了前端 这种事情发生的次数多了 就比较容易暴露水平 那
  • ConcurrentHashMap 常见面试题详解

    ConcurrentHashMap 1 ConcurrentHashMap的数据结构 数组 链表 采用了分段锁的实现机制 2 ConcurrentHashMap初始化 首先会创建segment数组 长度为默认 16 或传入的并发值的大于等于