# 1 什么是自旋锁和互斥锁?
由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么?
**自旋锁**说白了也是一种互斥锁,只不过没有抢到锁的线程会一直自旋等待锁的释放,处于**busy-waiting**的状态,此时等待锁的线程不会进入休眠状态,而是一直忙等待浪费
cpu周期。**因此自旋锁适用于锁占用时间短的场合。**
这里谈到了自旋锁,那么我们也顺便说下互斥锁。这里的**互斥锁**说的是传统意义的互斥锁,就是多个线程并发竞争锁的时候,没有抢到锁的线程会进入休眠状态即**sleep-waiting**,当锁被释放的时候,处于休眠状态的
一个线程会再次
获取到锁。缺点就是这一些列过程需要线程切换,需要执行很多
cpu指令,同样需要时间。如果
cpu执行线程切换的时间比锁占用的时间还长,那么可能还不如使用自旋锁。**因此互斥锁适用于锁占用时间长的场合。**
# 2 什么是CLH锁?
**CLH锁**其实就是一种是基于逻辑队列非线程饥饿的一种自旋公平锁,由于是 Craig、Landin 和 Hagersten三位大佬的发明,因此命名为CLH锁。
**CLH锁原理如下:**
1. 首先有
一个尾节点指针,通过这个尾结点指针来构建等待线程的逻辑队列,因此能确保线程线程先到先服务的公平性,因此尾指针可以说是构建逻辑队列的桥梁;此外这个尾节点指针是原子引用类型,避免了多线程并发操作的线程安全性问题;
2. 通过等待锁的每个线程在自己的某个变量上自旋等待,这个变量将由前
一个线程写入。由于某个线程
获取锁操作时总是通过尾节点指针
获取到前一线程写入的变量,而尾节点指针又是原子引用类型,因此确保了这个变量
获取出来总是线程安全的。
这么说肯定很抽象,有些小伙伴可能不理解,没关系,我们心中可以有个概念即可,后面我们会一步一图来彻彻底底把CLH锁弄明白。
# 3 为什么要学习CLH锁?
好了,前面我们对CLH锁有了
一个概念后,那么我们为什么要学习CLH锁呢?
研究过AQS源码的小伙伴们应该知道,AQS是JUC的核心,而CLH锁又是AQS的基础,说核心也不为过,因为AQS就是用了变种的CLH锁。如果要学好Java并发编程,那么必定要学好JUC;学好JUC,必定要先学好AQS;学好AQS,那么必定先学好CLH。因此,这就是我们为什么要学习CLH锁的原因。
# 最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

> 上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
>
> **资料领取方式:[点击这里免费
获取](https://gitee.com/vip204888/java-p7)**

以上就是本文的全部
内容,希望对大家的学习有所帮助,也希望大家多多
支持。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。