AQS学习(一)自旋锁原理介绍(为什么AQS底层使用自旋锁队列?)

Java28

1.什么是自旋锁?

作为锁的一种,自旋锁和互斥一样,也是并发环境中保护共享资源的一种锁机制。任何时候,只有一个执行单元可以获得锁。

[En]

As a kind of lock, spin lock, like mutex, is also a lock mechanism to protect shared resources in concurrent environment. At any time, only one execution unit can acquire the lock.

互斥锁通常利用操作系统提供的线程阻塞/唤醒机制实现,在争用锁失败时令线程陷入阻塞态而让出cpu,并在获取到锁时再将其唤醒。而自旋锁则是通过加锁程序中的无限循环,由当前尝试加锁的线程反复轮训当前锁的状态直到最终获取到锁。

互斥锁与自旋锁的优缺点

互斥锁的优点是当加锁失败时,线程会及时的让出cpu,从而提高cpu的利用率,但缺点是如果短时间内如果涉及到大量线程的加锁/解锁,则频繁的唤醒/阻塞会因为大量的线程上下文切换而降低系统的性能。因此互斥锁适用于线程会在较长时间内持有锁的场景。

与互斥锁相对的,自旋锁由于一直处于持续不断的轮训中,因此可以非常迅速的感知到锁状态的变化,在两个线程间能够瞬间完成锁的释放与获取。但如果需要争用锁的线程长时间都无法获取到锁,则会造成CPU长时间空转,造成CPU资源极大的浪费。因此自旋锁只适用于线程在加锁成功后会在极短的时间内释放锁的场景(需要保护的临界区非常小)。

自旋锁和互斥锁相辅相成,在不同的需求场景中各自发挥作用。

[En]

Spin lock and mutex lock play a complementary role, playing their own role in different requirements scenarios.

2.自旋锁的多种实现

本篇博客的重点是自旋锁的工作原理,由于存在许多种拥有不同特性的自旋锁,所以这里只挑选出几种具有代表性的自旋锁: 原始版本自旋锁、票锁TicketLock、CLH锁和MCS锁,介绍这几种自选锁的实现原理和各有的优缺点。

本篇博客中的自旋锁是用java实现的。为了方便测试,先抽象并定义了一个通用的自旋锁接口SpinLock。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

【Unity Shader学习笔记】Unity光照-渲染路径

官方文档:渲染路径 1、简介 需要为每个 Shader 设置正确的渲染路径。 在大多数情况下,一个项目只使用一个渲染路径,所以我们可以设置整个项目的渲染路径。[En]In most cases, a ...
Java

Java基础常见知识&面试题总结(中)

Java基础常见知识&面试题总结(中) 泛型 Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了...
Java

内存管理

名词解释 物理地址 对应着内存的单元寻址 与处理器和CPU连接的地址总线相对应 线性地址 也叫虚拟地址 逻辑地址 与分段有关。逻辑地址指的是指令中相对的地址。比如 call 40 ,这个40是就是逻辑...
Java

设计模式之代理模式

本文由老王出租房子引出——代理设计模式,将从最简单的静态代理实现开始,后延伸使用jdk实现动态代理,最后扩展到Cglib实现动态代理。为了更深入理解代理模式,我们会对实际应用中的典型案例进行介绍,包括...
Java

Java基础学习总结

写的这个博客是学习B站狂神说的Java教学视频的学习记录,记录了重点知识以及以前易混淆理解的知识点。本博客可能缺少部分基础知识点,适合像我一样学习Java过程中曾经半途而废的学生。 Java的注释分为...
Java

ucore操作系统学习(五) ucore lab5用户进程管理

ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度。通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行。 在lab5中需要更进一步,实现我们平常开发接触到的、运行...
Java

Java学习-动手动脑4

异常处理 ``` public class SystemExitAndFinally { public static void main(String[] args) { try { System.o...
Java

spring aop

代理相关的概念 advisor 包含切入点和切入方法 切点 pointcut 意即在哪里做切入 切入方法 advice 包括 运行前 返回后 抛出异常后 最终finally 环绕 五种 spring支...
Java

git 常用操作

可以把分支名理解为指针,比如 master,test,origin/master 等,都是一个指针,指向某次提交快照 特殊指针HEAD:Git有一个名为 HEAD 的特殊指针,它是一个指针,指向当前所...
Java

设计模式之策略模式

在收银系统中,如果普通用户、中级会员和高级会员对应不同的优惠策略,常规编程需要使用一系列判断语句来判断用户类型,在这种情况下可以使用策略模式。[En]In a cashier system, if o...