浅谈aqs
含义:抽象队列同步器,是并发包里的一个核心组件,里面有state变量、加锁线程变量等核心的东西,维护了加锁状态。AQS就是一个并发包的基础组件,用来实现各种锁,各种同步组件的。
工作原理图:
CLH队列:
原理描述:
主要这几个关键变量需要了解一下:
1.state:volitale修饰,是int类型的,代表了加锁的状态。加锁的过程,直接就是用CAS操作将state值从0变为1。
2.exclusiveOwnerThread:加锁线程,用来记录当前加锁的是哪个线程
3.clh队列:AQS内部还有一个等待队列,专门放那些加锁失败的线程!
原理流程:
1.线程1过来加锁,如果之前没人加过锁,那么state的值肯定是0,CAS操作将state值从0变为1,此时线程1就可以加锁成功。一旦线程1加锁成功了之后,就可以设置当前加锁线程是自己。
2.线程2跑过来一下看到,state的值不是0,所以CAS操作将state从0变为1的过程会失败,因为state的值当前为1,说明已经有人加锁了!接着线程2会看一下是不是自己之前加的锁,“加锁线程”这个变量明确记录了是线程1占用了这个锁,所以线程2此时就是加锁失败。线程2会将自己放入AQS中的一个等待队列,因为自己尝试加锁失败了,此时就要将自己放入队列中来等待,等待线程1释放锁之后,自己就可以重新尝试加锁了。
3.线程1在执行完自己的业务逻辑代码之后,就会释放锁!他释放锁的过程非常的简单,就是将AQS内的state变量的值递减1,如果state值为0,则彻底释放锁,会将“加锁线程”变量也设置为null!
4.接下来,会从等待队列的队头唤醒线程2重新尝试加锁。线程2现在就重新尝试加锁,这时还是用CAS操作将state从0变为1,此时就会成功,成功之后代表加锁成功,就会将state设置为1。此外,还要把“加锁线程”设置为线程2自己,同时线程2自己就从等待队列中出队了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)