JDK内置并发框架AQS对CLH锁的优化

article/2025/11/5 18:42:19

自旋锁的不足

自旋锁适用于锁占用时间短,即锁保护临界区很小的情景。它需要保证各缓存数据的一致性,这可能会导致性能问题。因为在多处理器机器上每个线程对应的处理器都对同一个变量进行读写,而每次读写都要同步每个处理器的缓存。此外,自旋锁无法保证公平性,即不保证先到先获得,这就可能造成线程饥饿。

CLH锁

为了优化同步带来的花销,Craig、Landin、Hagersten三个人发明了CLH锁。其核心思想是:通过一定手段将所有线程对某一共享变量的轮询竞争转化为一个线程队列,且队列中的线程各自轮询自己的本地变量。

这个转化过程有两个要点:一是应该构建怎样的队列以及如何构建队列?为了保证公平性,我们构建的将是一个FIFO队列。构建的时候主要通过移动尾部节点tail来实现队列的排队,每个想获取锁的线程创建一个新节点并通过CAS原子操作将新节点赋给tail,然后让当前线程轮询前一节点的某个状态位。如图可以清晰看到队列结构及自旋操作,这样就成功构建了线程排队队列。二是如何释放队列?执行完线程后只需将当前线程对应的节点状态位置为解锁状态即可,由于下一节点一直在轮询,所以可获取到锁。

CLH锁

所以,CLH锁的核心思想是将众多线程长时间对某资源的竞争,通过有序化这些线程将其转化为只需对本地变量检测。而唯一存在竞争的地方就是在入队列之前对尾节点tail的竞争,但此时竞争的线程数量已经少了很多了。比起所有线程直接对某资源竞争的轮询次数也减少了很多,这也大大节省了CPU缓存同步的消耗,从而大大提升系统性能。


http://chatgpt.dhexx.cn/article/mCvkePWQ.shtml

相关文章

面试经典必问:ReentrantLock 中CLH队列

ReentrantLock 中的加锁操作都是通过Syn这个抽象类来完成,具体解析在之前得博客已经分析过了,请参考:ReentrantLock AQS操作解析 得不到锁的线程,如何排队? JUC中锁的排队策略,是基于CLH队列的变种实现的…

java clh_【Java并发编程实战】----- AQS(四):CLH同步队列

在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取…

CLH锁 、MCS锁

一.引文 1.1 SMP(Symmetric Multi-Processor): 对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP能够保证内存一致性…

CLH锁

1.1 SMP(Symmetric Multi-Processor) 对称多处理器结构,它是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中,一台计算机由多个CPU组成,并共享内存和其他资源,所有的CPU都可以平等地访问内存、I/O和外部中断。…

java clh_CLH锁学习

CLH锁即Craig, Landin, and Hagersten (CLH) locks,CLH锁是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。 何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都…

aqs clh java_并发编程——详解 AQS CLH 锁

从 acquire 方法开始 —— 获取 为什么 AQS 需要一个虚拟 head 节点 reelase 方法如何释放锁 总结 前言 AQS 是 JUC 中的核心,其中封装了资源的获取和释放,在我们之前的 并发编程之 AQS 源码剖析 文章中,我们已经从 ReentranLock 那里分析了锁…

java clh_CLH lock 原理及JAVA实现

CLH 锁的名字也与他们的发明人的名字相关:Craig,Landin and Hagersten。 CLH Lock摘要 CLH lock is Craig, Landin, and Hagersten (CLH) locks, CLH lock is a spin lock, can ensure no hunger, provide fairness first come first service. The CLH l…

CLH队列

NUMA与SMP SMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一…

CLH锁 简介

转自CLH锁 简介 - gaob2001的个人空间 - OSCHINA - 中文开源技术交流社区 概述 在学习Java AQS框架的时候发现加锁的逻辑非常奇怪,后来得知加锁逻辑是CLH锁的一个变种,于是了解一下,对于理解AQS框架有好处。 简介 CLH锁是有由Craig, Land…

CLH同步队列

文章转载自:https://blog.csdn.net/chenssy/article/details/60781148 AQS简介中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步…

AQS的前菜—详解CLH队列锁

https://blog.csdn.net/weixin_47184173/article/details/115340014 什么是CLH队列锁 CLH锁其实就是一种基于逻辑队列非线程饥饿的一种自旋公平锁。当多线程竞争一把锁时,获取不到锁的线程,会排队进入CLH队列的队尾,然后自旋等待&#xff0c…

CLH(Craig, Landin, and Hagersten locks)机制

CLH(Craig, Landin, and Hagersten locks): 是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现…

【Java】Java函数式编程以及流的操作

文章目录 大纲lambda表达式一般内部类局部内部类匿名内部类 基于函数式接口的lambda表达式JDK8中自带的函数式接口Predicate判断Consumer消费Supplier供应商Function方法其他接口 方法引用和构造器引用静态方法引用非静态方法引用构造器引用 lambda表达式中的异常处理Currying …

【Java进阶】java函数式编程的使用

目录 1.目前Java中自带的函数式编程接口 2.java中使用函数式编程的案例 3.自定义函数式接口 4.自定义函数式接口的实现 简单一句话理解函数式编程,传统的方法调用我们都是传递参数,而函数式编程,传递的则是方法实现的过程。 1.目前Java中自…

Java教程:一文详解函数式编程

看懂了这篇-你就懂了函数式接口 ​ 函数式编程是一种编程规范或一种编程思想,简单可以理解问将运算或实现过程看做是函数的计算。 Java8为了实现函数式编程,提出了3个重要的概念:Lambda表达式、方法引用、函数式接口。现在很多公司都在使用l…

java中的函数式编程(一)

当你安安稳稳的学着java,慢慢开始写代码。 兢兢业业,本着面向对象的编程方式。 知道有一种叫做“面向过程”的方式,但是你不在意。 写了一段时间后有人告你,函数式编程很爽! 你也看到了他给的一个实例,看着…

Java函数式编程(基础):第一部分

1.函数式编程有三个部分: 第一个部分是:Lambda表达式 第二个部分是:方法引用 第三个部分是:函数式接口 刚接触Lambda表达式的我,觉得它很神奇,能够用简短的代码,代替传统的编程方式 举一个简…

java-函数式编程浅谈

了解函数式编程的实际应用场景以及优点。 文章目录 什么是函数式编程函数式编程的使用原理解析 什么是函数式编程 以数学中的函数作为切入点,只关注参数之间的运算满足某种规则,例如zxy。 那么如何体现在编程中呢,熟知的function定义可以作…

Java 8函数式编程

函数式接口 一个接口中,有且只有一个抽象方法,这个接口就叫做函数式接口。常常使用FunctionalInterface注解作为编译校验。满足函数式接口的要求,才能校验通过,否则会在校验阶段失败。 接口中有且只能有一个抽象方法,…

【函数式编程实战】(一)Java演变与函数式编程

前言 📫作者简介:小明Java问道之路,专注于研究计算机底层/Java/Liunx 内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫 🏆CSDN专家博主/Java领域优质…