ConcurrentHashMap 为什么是线程安全的?

1、典型回答

ConcurrentHashMap 在不同JDK 版本中,保证线程安全的手段是不同的,它主要分为以下两种情况:

  1. JDK 1.7 之前(包含JDK 1.7),ConcurrentHashMap 主要是通过分段锁 (Segment Lock) 来保证线程安全的。
  2. 而在JDK 1.8 之后(包含JDK 1.8) ,使用了粒度更小锁,通过在数组的头节点加锁来保证线程安全的,并且加锁的手段也进行了优化,它使用的是 CAS + volatile 或 synchronized 来保证线程安全的。

2、全面剖析

concurrentHashMap 在早期版本中(JDK 1.7 之前,包含JDK 1.7)是通过悲观锁 Lock 添加分段锁来保证线程安全的,而到了之后版本中,是通过粒度更小的在数组头节点加锁(悲观锁 synchronized 或者是乐观锁CAS+volatile)的方式来保证线程安全的

那么问题来了,什么是分段锁? 请参考:什么是分段锁?-CSDN博客

分段锁的实现如下图所示:

高版本头节点加锁示意图如下:

3、知识扩展

什么是悲观锁和乐观锁? 它们有什么区别?

悲观锁和乐观锁是并发编程中常用的两种锁机制(或者说两种锁策略或者是两种实现锁的思想)
它们的区别如下:

  1. 悲观锁(Pessimistic Locking):悲观锁假设会发生竞争,因此在访问共享资源前会获取锁,以防止其他线程对该资源的修改。悲观锁在操作期间会将共享资源锁定,其他线程无法操作,直到锁被释放。!典型的悲观锁实现包括 synchronized 关键字和 ReentrantLock。
  2. 乐观锁(Optimistic Locking):乐观锁假设不会发生竞争,因此在访问共享资源时不会加锁,而是在更新资源时检查是否有其他线程同时更新,并通过版本号等方式进行验证。如果验证通过,则更新资源,否则重新尝试。乐观锁适用于并发冲突相对较少的情况,能够提高并发性能。典型的乐观锁实现包括 CAS(Compare andSwap) 操作和版本号机制。

它们的区别主要体现在以下几点:

  • 加锁机制:悲观锁在访问共享资源前会获取锁,而乐观锁在访问共享资源时不会加锁
  • 锁状态:悲观锁将共享资源锁定,其他线程无法操作,而乐观锁不会锁定资源,允许其他线程同时访问。
  • 并发性能:乐观锁适用于并发冲突较少的场景,可以提供更好的并发性能,而悲观锁则适用于竞争较激烈的场景,保证数据的一致性和安全性。

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

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

相关文章

C语言----strcpy和strcat的使用和模拟实现

一,strcpy()函数 strcpy() 函数是 C语言中一个非常重要的字符串处理函数,其功能是将一个字符串复制到另一个字符串中。该函数原型如下: char*strcpy(char*dest,const char*src) 其中,dest 表示目标字符串,即将被复制到…

iOS开发之SwiftUI

iOS开发之SwiftUI 在iOS开发中SwiftUI与Objective-C和Swift不同,它采用了声明式语法,相对而言SwiftUI声明式语法简化了界面开发过程,减少了代码量。 由于SwiftUI是Apple推出的界面开发框架,从iOS13开始引入,Apple使用…

时间戳的转换-unix时间戳转换为utc时间(python实现)

import datetimetimestamp = 1711358882# 将时间戳转换为UTC时间 utc_time = datetime.datetime.utcfromtimestamp(timestamp)# 格式化并输出时间 formatted_time = utc_time.strftime(%Y-%m-%d %H:%M:%S) print(formatted_time)同样:UTC如何转换为unix时间戳 from datetime …

P6技巧:对计划执行纠偏措施

前言 对施工计划的滞后原因分析,通常采取由大到小、由高到低的方法。即首先查看总体进度偏差,再分析其偏差主要来源于哪部分。 项目进度评估与偏差控制 项目实施过程中,项目控制人员应对进度实施情况进行跟踪、采集数据,并根据…

OC高级编程 第3章:Grand Central Dispatch

3.1 Grand Central Dispatch (GCD)概要 3.1.1什么是GCD Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用中记述线程管理用的代码在系统级中实现。开发者只要定义想执行的任务并追加到Dispatch Queue中,GCD就能生成必要的…

5 IOC/DI注解开发

文章目录 3,IOC/DI注解开发3.1 环境准备3.2 注解开发定义bean步骤1:删除原XML配置步骤2:Dao上添加注解步骤3:配置Spring的注解包扫描步骤4:运行程序步骤5:Service上添加注解步骤6:运行程序知识点1:Component等 3.2 纯注解开发模式3.2.1 思路分析3.2.2 实…

Linux下对线程的认识+生产消费者模型+信号量

线程的概念 线程是进程内部中更加轻量化的一种执行流。线程是CPU调度的基本单位,而进程是承担系统资源的实体。就是说一个进程中可能会有多个线程,而在Linux内核中并没有真正重新的创建线程并重新进行资源分配,因为我们每个线程指向的资源都是…

mac电脑下安装和启动nginx

一,安装homebrew 必须安装了homebrew,可在终端输入命令brew -v查看是否已经安装,没安装的话安装一下: 如果未安装先安装(网上很多文章) 二,查看nginx是否存在 使用命令:brew search nginx查看nginx是否存在: 不存在的话,就使用brew inst…

Java螺旋折线

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 (X,Y),我们定义它到原点的距离dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。 例如 dis(0,1)3,dis(−2,−1)9。 给出整点坐标 (X,Y),你能计算出 dis(X,Y) 吗&#xf…

HCIA实验

实验目的: 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置IP地址,之后不能再对其进行任何配置; 2、R1-R5为局域网,私有IP地址192.168.1.0/24,请合理分配; 3、R1、R2、R4&#x…

如何着手写一个自己的网站管理客户端

WebHole 项目地址 https://gitee.com/yiyefangzhou24/web-hole 是什么?能干什么? WebHole是一款网站管理软件,类似但不同于菜刀、冰蝎、蚁剑,能通过C/S的工作模式,方便的管理服务器的文件、数据库,并执…

自定义类型(2)

1联合体 1.1 联合体类型的声明 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所 以联合体也叫:共⽤体。 给联合体其…

基于springboot+vue的流浪动物管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

2核4G服务器最多支持多少用户同时在线?

腾讯云轻量应用服务器2核4G5M配置性能测评,腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?并发数10,支持每天5000IP人数访问,腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线?并发数测试、CPU性能、内存性能、…

软件测试|使用selenium进行多窗口操作

简介 在我们进行自动化测试的工作中,经常会点击某个元素或者链接就会自动打开一个新页面,需要我们转到新打开的页面去进行操作,这个时候我们就需要能够自动切换到新页面进行后续的操作,selenium同样支持这个功能,本文…

我们的服务器安全护卫——德迅卫士

德迅卫士 德迅卫士采用自适应安全架构,有效解决传统专注防御手段的被动处境,为系统添加强大的实时监控和响应能力,帮助企业有效预测风险,精准感知威胁,提升响应效率,保障企业安全的最后一公里。 德迅卫士…

python初级第一次作业

一、 dayint(input("enter today day")) fdayint(input("enter num of day since today")) c((fday%7)day)%7 if c0:print("sunday") elif c1:print("monday") elif c2:print("tuesday") elif c3:print("wendnsday&quo…

算法打卡day16

今日任务: 1)513.找树左下角的值 2)112.路径总和 3)113.路径总和Ⅱ 4)106.从中序与后序遍历序列构造二叉树 5)105.从前序与中序遍历序列构造二叉 513.找树左下角的值 题目链接:513. 找树左下角…

【网络建设与运维】2024年河北省职业院校技能大赛中职组“网络建设与运维”赛项规程

培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:775454947 网络系统管理群:223627079 网络建设与运维群:870959784 极安云科专注于技能提升,赋能 2024年广东省高校的技能提升,在培训中我们的应急…

MCGS学习——运行策略与脚本程序

语法讲解 运行策略:脚本的编程环境启动策略:在进入运行环境后首先运行的策略,只运行一次,一般完成系统初始化的处理循环策略:按照用户指定的周期时间,循环执行策略块内的内容,通常用来完成流程…
最新文章