AQS:原理、组成与锁机制解析

发布时间:2026/10/10 6:10:28

AQS:原理、组成与锁机制解析 1. 什么是AQS作用是什么AQSAbstractQueuedSynchronizerAQS是一个用于构建锁和同步器的抽象的线程同步框架用于解决线程阻塞和资源抢占的问题。2. AQS的组成包含哪些内容1.state同步状态用于记录资源的占用模式即记录资源在独占模式和共享模式下什么时候占用锁。2.CLH队列是一个虚拟双向队列用于存放暂时获取锁失败的线程每个在队列里等待的线程被封装成一个Node节点。3. AQS独占锁的获取流程先直接获抢锁第一次抢锁线程调用lock()方法首先通过CAS抢锁如果state为0则抢锁成功当前线程成功持锁如果state为1则表示锁已经被其他线程持有抢锁失败抢锁失败则进入acquire(int arg)方法。抢锁失败进入acqui()方法第二次抢锁一进入acquire(int arg)方法马上调用tryAcquire(arg) 方法再次进行抢锁tryAcquire(arg)里是用nonfairTryAcquire方法CAS快速进行抢锁。入队如果返回true则表示抢锁成功该线程成功持有锁若返回false则抢锁失败需要用addWaiter方法CAS自旋式将这个线程放入acquireQueued队列里。排队与阻塞这个线程放入acquireQueued队列里(1).首先如果在队列里是对头元素直接获取锁该线程成功持锁(2).若不是对头元素则判断其前驱是否为对头元素是则可以抢锁只有头节点的后继才有资格尝试获取锁直接调用tryAcquire方法抢锁如果抢锁成功则当前线程成功持锁(3).失败则线程阻塞看看前驱节点的状态是否为可以唤醒后继节点状态即SIGNAL-1如果是则等待被唤醒后得到抢锁资格继续抢锁如果不是即前驱节点异常即SIGNAL-1时重新通过CAS自旋抢锁直至抢到锁或者其前驱节点状态为SIGNAL-1。4. 共享模式和独占模式有什么区别多线程实现下独占模式某一个操作只能给一个线程进行线程A在进行时别的线程只能阻塞。state就是用来判断该操作是否在被线程进行。eg线程A想要执行某一操作若state0说明这个操作没有别的线程在执行该线程可以执行这个操作并且state会将0改成1此时state1若此时线程B也想进行这个操作但是state1则线程B就进行不了这个操作会被阻塞。共享模式某一个操作能够给多个线程执行线程A/B/C...等等只要在共享名额用户自己设置的内可以多线程一起操作。eg共享模式下需要限制线程共享名额不限制系统会崩溃用state来限制。首先先设置共享的数量n所以staten0线程A想要执行某一操作staten说明这个操作还没有别的线程在执行该线程可以执行这个操作并且state会数量减一来表示又有1个线程进行该操作共享名额减一所以state-1若此时线程B也想进行这个操作也是重复这个流程直至有某个线程想进行这个操作但是state0则表示共享名额为0已经不能再共享这个操作了这个线程就好被阻塞。5. AQS的公平锁和非公平锁有什么区别公平锁和非公平锁最大的区别在于在抢锁时是否排队。公平锁公平锁在线程抢锁时会遵循先进先出的排队原则排队只有队头元素可以拿到锁其余线程会被阻塞在外面需要等待唤醒后才能再次尝试获取锁。优点公平锁这样保证了每个线程都能拿到锁不会产生饥饿线程。缺点这样排队取锁的方式每个线程都会阻塞与唤醒性能消耗太大。非公平锁非公平锁在线程抢锁时先会插队抢锁即一上来就先直接抢锁不先排队如果刚刚好有锁空闲了可以直接强到并尺有锁若一上来插队抢锁不成功才会去排队。优点没有一上来就排队而是插队抢锁减少了阻塞和唤醒消耗的性能。缺点会存在饥饿线程的风险因为有可能插队抢锁多次成功导致在排队的线程一直拿不到锁。
延伸阅读

更多相关文章

2026/10/9 3:20:26

一文读懂Git 的底层原理:从 Commit 到 Blob

文章目录Git 概述Git 的内容追踪原理通过实际操作来理解第一种 object 类型:commit第二种 object 类型:tree第三种 object 类型:blob第二次 commit用 reference 追踪 commitTag总结Git 作为分布式版本管理工具的核心作用:支撑多人…

2026/10/8 22:56:46

函数相关知识

一、什么是函数? 函数是一个“可执行的代码块”,但在 JavaScript 中,它本质上是一种特殊的对象(Object),它拥有普通对象没有的“内部属性”[[Call]],这就是它能被执行的原因。特殊之处&#xff…

2026/10/10 6:10:16

iptables规则不生效?从计数器、LOG追踪到tcpdump的完整排查实战

说个场景:你给 iptables 加了一条放行规则,逻辑推演了几遍都觉得没问题,结果测试的时候流量就是不通。更气人的是,你用iptables -L -n看规则明明就在那里,但业务毫无反应。这种“规则存在但等于没存在”的状态&#xf…

2026/10/10 6:10:16

蓝牙模块 AT 指令无响应怎么办?从供电、串口到指令格式逐步排查

通过串口工具向蓝牙模块发送 AT 指令后没有响应或返回 ERROR?本文按供电、串口接线、串口参数、发送格式、蓝牙连接状态和指令格式逐项排查。 本文根据现有蓝牙模块问题资料整理,具体参数和指令请以对应产品文档为准。问题现象使用串口工具向蓝牙模块发送…

2026/10/10 6:05:16

单片机毕设选题推荐:基于单片机的多因子室内环境数据采集上传与超标联动响应系统设计 基于单片机的室内环境综合监测系统及移动端远程交互装置设计(030110)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑