JDK内置并发框架AQS对CLH锁的优化
自旋锁的不足
自旋锁适用于锁占用时间短,即锁保护临界区很小的情景。它需要保证各缓存数据的一致性,这可能会导致性能问题。因为在多处理器机器上每个线程对应的处理器都对同一个变量进行读写,而每次读写都要同步每个处理器的缓存。此外,自旋锁无法保证公平性,即不保证先到先获得,这就可能造成线程饥饿。
CLH锁
为了优化同步带来的花销,Craig、Landin、Hagersten三个人发明了CLH锁。其核心思想是:通过一定手段将所有线程对某一共享变量的轮询竞争转化为一个线程队列,且队列中的线程各自轮询自己的本地变量。
这个转化过程有两个要点:一是应该构建怎样的队列以及如何构建队列?为了保证公平性,我们构建的将是一个FIFO队列。构建的时候主要通过移动尾部节点tail来实现队列的排队,每个想获取锁的线程创建一个新节点并通过CAS原子操作将新节点赋给tail,然后让当前线程轮询前一节点的某个状态位。如图可以清晰看到队列结构及自旋操作,这样就成功构建了线程排队队列。二是如何释放队列?执行完线程后只需将当前线程对应的节点状态位置为解锁状态即可,由于下一节点一直在轮询,所以可获取到锁。
所以,CLH锁的核心思想是将众多线程长时间对某资源的竞争,通过有序化这些线程将其转化为只需对本地变量检测。而唯一存在竞争的地方就是在入队列之前对尾节点tail的竞争,但此时竞争的线程数量已经少了很多了。比起所有线程直接对某资源竞争的轮询次数也减少了很多,这也大大节省了CPU缓存同步的消耗,从而大大提升系统性能。
JDK内置并发框架AQS对CLH锁的优化相关推荐
- aqs clh java_Java并发编程:AQS对CLH锁的优化
自旋锁适用于锁占用时间短,即锁保护临界区很小的情景AQS的自旋锁详解>.它需要保证各缓存数据的一致性,这可能会导致性能问题.因为在多处理器机器上每个线程对应的处理器都对同一个变量进行读写,而每次 ...
- JDK内置并发AQS同步器的独占锁获取与释放
作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.计算机视觉.架构.分布式.高并发.大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java.Python和C++. ...
- join left 大数据_Java并发编程笔记-JDK内置并行执行框架Fork/Join
Fork/Join由来-分而治之思想 分而治之:对于一个比较复杂的任务,如果可以很自然地将其分解为多个子任务,这些子任务互相独立且与原问题性质相同,递归地处理这些子任务,然后将各个子任务的结果合并得到 ...
- Log4j日志的简单替代:JDK内置log的简单封装
前段时间Log4j爆出严重漏洞,其实我一直都不太喜欢这个臃肿的框架. 下面代码对JDK内置的log简单地封装了一下.直接复制到项目即可用.更不需要maven. 使用方法看main函数. import ...
- jdk内置线程实例_EA问题的JDK14实例
jdk内置线程实例 Tagir Valeev最近发布了一条有关即将发布的Java JDK14版本的预览功能的推文: #Java14模式匹配将名称隐藏带入了更高的疯狂程度. 在这里,我为FLAG字段添加 ...
- Java虚拟机学习总结(3)——JDK内置工具(jps、jstack、jmap、jstat)使用详解
一.JDK内置工具 - javap 1. 介绍 java 反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件. 2.命令 javap <options> <clas ...
- JDK内置命令行工具
java命令行 序号 接口 java Java 应用的启动程序 javac JDK 内置的编译工具 javap 反编译 class 文件的工具 javadoc 根据 Java 代码和标准注释,自动生成 ...
- JDK 内置命令行工具:工欲善其事,必先利其器
很多情况下,JVM 运行环境中并没有趁手的工具,所以掌握基本的内置工具是一项基本功. JDK 自带的工具和程序可以分为 2 大类型: 开发工具 诊断分析工具 JDK 内置的开发工具 写过 Java 程 ...
- 6. JDK内置命令行工具
JDK自带的工具和程序分为2大类型: 开发工具 诊断分析工具 开发工具 工具 简介 java Java 应用的启动程序 javac JDK 内置的编译工具 javap 反编译 class 文件的工具 ...
- 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)
深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...
最新文章
- Flex与.NET互操作(八):使用FluorineFx网关实现远程访问
- 设计模式(24)-----责任链模式
- mysql odbc.ini_ODBC连接mysql
- 转:获得数据库自增长ID(ACCESS)与(SQLSERVER)
- java时间的整的表达式_Quartz中时间表达式的设置-----corn表达式
- C#一次性删除委托中的所有方法
- Java21天打卡Day6-switch
- 开发更安全的asp.net应用程序一
- 数据库中int类型存在空数据开发过程中model和dal层处理方法
- 在deepin 上安装佳能MF 4700打印机驱动
- 4173: 数学 欧拉函数 思路题
- 什么是运维高手的境界?
- Altuim Designer PCB设计
- Python编程:判断字符串中是否包含中文
- CVPR2022知识蒸馏用于目标检测:Focal and Global Knowledge Distillation for Detectors
- jMonkeyEngine译文 FlagRush7(1)——拥抱大地让我们驾驶的不再是Box
- maximo邮件配置
- count distinct
- 谷歌浏览器(Chrome)查看http报文headers信息
- UCOSII操作系统(四)--任务管理