AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态 。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中 。一、AQS的核心思想【JAVA多线程 JAVA多线程之AQS】AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态 。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中 。
二、实现原理

文章插图
1、private volatile int state:AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作 。AQS使用CAS对该同步状态进行原子操作实现对其值的修改 。
//获取状态protected final int getState() {return state;}//设置状态值protected final void setState(int newState) {state = newState;}//通过CAS修改状态protected final boolean compareAndSetState(int expect, int update) {// See below for intrinsics setup to support thisreturn unsafe.compareAndSwapInt(this, stateOffset, expect, update);}在ReentrantLock中,stste表示获取锁的线程数,假如state=0,表示还没有线程获取锁,1表示有线程获取了锁 。大于1表示重入锁的数量 。
2、CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系) 。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配 。
三、ReentrantLock中的公平锁与非公平锁

文章插图
公平锁:当前线程在抢锁之前先看看队列中是否有排队的线程,如果有则不允许抢,直接加入队列 。
非公平锁:当前线程在抢锁之前不需要查看队列中是否有排队的线程 。
古之学者为己,今之学者为人
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
