当前位置: 首页 > news >正文

为什么concurrenthashmap的segment要设计成可重入锁?

`ConcurrentHashMap` 在 Java 中的早期版本(如 Java 1.5 到 Java 1.8)使用了分段锁(Segment)的设计,用以提高并发访问时的性能。每个 Segment 包含一个小的哈希表,多个 Segment 通过继承 `ReentrantLock` 实现了可重入锁的特性。以下是设计成可重入锁的几个原因:

1. **可重入性**:可重入锁意味着同一个线程可以多次获取同一把锁而不会发生死锁。在 `ConcurrentHashMap` 中,如果线程已经持有了某个 Segment 的锁,那么它可以安全地再次进入该 Segment 执行其他操作,比如修改同一个 Segment 中的不同桶(bucket)。

2. **锁的粒度**:通过将整个映射分割成多个 Segment,每个 Segment 维护自己的锁,锁的粒度变小了。这种设计可以让不同的线程并发地修改不同 Segment 中的数据,而不会相互干扰,从而提高了并发性能。

3. **灵活性**:可重入锁提供了比普通锁更多的灵活性。例如,线程可以尝试获取锁,并在获取失败时执行其他逻辑,而不是简单地阻塞。

4. **锁的公平性**:`ReentrantLock` 可以选择性地提供公平锁的特性,这意味着等待时间最长的线程会优先获取锁。尽管默认情况下 `ConcurrentHashMap` 的分段锁不是公平的,但提供了这种可能性。

5. **监控和扩展性**:`ReentrantLock` 提供了丰富的监控方法,比如可以检测锁的状态、是否有线程在等待等,这对于调试和性能监控非常有用。同时,可重入锁的设计也便于未来的功能扩展。

需要注意的是,从 Java 1.8 开始,`ConcurrentHashMap` 的实现已经放弃了分段锁的设计,转而采用了 `CAS` 操作和 `synchronized` 关键字来控制并发访问,这样进一步降低了竞争,提高了并发性能。这种新设计仍然保留了可重入的特性,但不再以分段锁的形式实现。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux源码阅读笔记13-进程通信组件中
  • 大厂linux面试题攻略五之数据库管理
  • delphi 12 学习如何登陆网站下载文件
  • 消息队列:Kafka吞吐量为什么比RocketMQ大
  • 3.特征工程-特征抽取、特征预处理、特征降维
  • 第一阶段面试问题(后半部分)
  • java之IO篇——File、字节流、字符流
  • 【IO】使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
  • 新书速览|AI创意商业广告设计:Adobe Firefly + Photoshop
  • 现代前端架构介绍(第一部分):App是如何由不同的构建块构成的
  • 数据中台建设之数据汇聚与数据交换
  • Apache Pig: 高级数据处理平台
  • 【开源】嵌入式Linux(IMX6U)应用层综合项目(1)--云平台调试APP
  • 网络流算法:最大流问题
  • SparkSQL---编程模型的操作,数据加载与落地及自定义函数的使用
  • #Java异常处理
  • Django 博客开发教程 16 - 统计文章阅读量
  • Js基础——数据类型之Null和Undefined
  • mysql 5.6 原生Online DDL解析
  • PhantomJS 安装
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spark学习笔记之相关记录
  • SpriteKit 技巧之添加背景图片
  • Theano - 导数
  • vue中实现单选
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 面试遇到的一些题
  • 深入 Nginx 之配置篇
  • 使用 QuickBI 搭建酷炫可视化分析
  • 怎么把视频里的音乐提取出来
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • kubernetes资源对象--ingress
  • Prometheus VS InfluxDB
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #100天计划# 2013年9月29日
  • #VERDI# 关于如何查看FSM状态机的方法
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Git) gitignore基础使用
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (ZT)一个美国文科博士的YardLife
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十六)串口UART
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)VC++中ondraw在什么时候调用的
  • ******之网络***——物理***