工作中需要用到的Java知识(AQS篇)
admin
2024-02-06 15:23:54
0

AQS是在面试的时候比较常问的内容,那么今天我们就来简单了解一下什么是AQS。

什么是AQS?

我们来简单说说什么是AQS,AQS其实是指Java中的AbstractQueuedSynchronizer类,这个类在java.util.concurrent.locks包下,是Java用来实现轻量级锁的类。

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

CLH队列是根据发明者三人名字的首字母命名的。CLH队列从逻辑上形成一个锁等待队列(实际无队列实例,仅通过节点间的关联来实现)从而实现加锁,CLH锁只支持按顺序加锁和解锁(FIFO先入先出),不支持重入,不支持中断。

AQS中还有一个state变量,用来判断当前是否为同步状态(通过CAS方法来改变state的值),0:资源空闲,当state变量大于0时表示资源正在锁定中,且state的值表示锁定资源的重入次数。

AQS的工作流程就是基于CLH虚拟队列,用volatile关键字修饰共享变量state,想要获取锁的线程通过CAS方法去改变state变量,成功则获取到锁,失败则进入等待队列中等待唤醒。

AQS采用了模板模式的设计方法

我们只需要按照模板创建自己的类,就可以生成一个自定义的同步器(锁)。

首先我们要遵守这两步:

1. 内部类同步器需要继承AbstractQueuedSynchronizer并重写指定的方法。

2. 外部类同步器需要实现Lock接口与Serializable接口提供对外服务。

我们去创建自定义同步器的时候只需要实现共享变量state的获取与释放即可,等待队列的维护都由AQS底层实现。

自定义同步器需要实现的方法:

方法名作用
isHeldExclusively()该线程是否正在独占资源。只有用到condition才需要去实现它
tryAcquire(int)独占方式。尝试获取资源,成功则返回true,失败则返回false。
tryRelease(int)独占方式。尝试释放资源,成功则返回true,失败则返回false。
tryAcquireShared(int)共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
tryReleaseShared(int)共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。

ReentrantLock为例,(可重入独占式锁):state变量初始化为0,表示未锁定状态,A线程lock()时,会调用tryAcquire()独占锁并将state+1.之后其他线程再想tryAcquire的时候就会失败,直到A线程unlock()到state=0为止,其他线程才有机会获取该锁。A释放锁之前可以重复获取此锁(state累加),这就是可重入的概念。
注意:获取多少次锁就要释放多少次锁,保证state是能回到零态的。

CountDownLatch为例,任务分N个子线程去执行,state就初始化为N,N个线程并行执行,每个线程执行完之后countDown()一次,state就会CAS减一。当N子线程全部执行完毕,state=0,会unpark()主调用线程,主调用线程就会从await()函数返回,继续之后的动作。

接下来我们尝试自定义实现一个同步器。

/*** @description: 自定义同步器* @author: Me* @createDate: 2022/11/21 11:09* @version: 1.0*/
public class NonReentrantLock implements Lock, Serializable {// 同步器实现时一般都将自定义同步器定义为内部类,供自己使用,并实现某个接口,向外提供服务,一般实现Lock接口// 内部类的好处在于可以变相实现多继承// 内部类会对同一个包下的其他类隐藏,内部类可以使用private关键字修饰// 内部类可以访问外部类的全部字段与方法,外部类访问内部类需要创建内部类对象,内部类中不能有静态成员private static class Sync extends AbstractQueuedSynchronizer{@Overrideprotected boolean tryAcquire(int arg) {assert arg == 1;// cas方法,将变量0改为1if (compareAndSetState(0,1)){// 修改成功则上锁setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int arg) {assert arg == 1;//如果state为0,则抛出异常if (getState()==0){throw new IllegalMonitorStateException();}// 如果state变量不为0,则释放锁setExclusiveOwnerThread(null);setState(0);return true;}@Overrideprotected boolean isHeldExclusively() {// 是否锁已经被持有return getState() == 1;}//提供条件变量接口public Condition newCondition(){return new ConditionObject();}}Sync sync = new Sync();@Overridepublic void lock() {sync.acquire(1);}@Overridepublic void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Overridepublic boolean tryLock() {return sync.tryAcquire(1);}@Overridepublic boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(time));}@Overridepublic void unlock() {sync.release(1);}@Overridepublic Condition newCondition() {return sync.newCondition();}
}

到这里AQS就简单介绍完啦,希望对小伙伴们有所帮助。

相关内容

热门资讯

随便求几个成语加解释 随便求几个成语加解释最好是我没见过得,谁都知道的就不要了,词语也行簪缨世族 [zān yīng...
吴京到底是如何成功的呢? 吴京到底是如何成功的呢? 一个成功的作品不是看票房,而是看能影响多少人。诚然,吴京的成功,不是看他票...
谁能提供有关男生宿舍女生宿舍的... 谁能提供有关男生宿舍女生宿舍的剧本素材?情节剧《男生宿舍》、《女生宿舍》两类大家熟悉的生活题材命题。...
旅社和针孔旅社是同一部电影吗? 旅社和针孔旅社是同一部电影吗?什么来的啊。不太懂啊。
蟑螂用信宜话点讲啊? 蟑螂用信宜话点讲啊?呵!这个问题我来帮你吧!我是信宜人。蟑螂用信宜话是这样说:“嘎侄” 追问: ...
求规则的故事 求规则的故事规则涉及到的方面很多。有规则的制定,强者永远是制定规则的人,规则的执行,规则的合理利用·...
惊蛰吃什么民间 惊蛰吃什么民间惊蛰吃梨  在民间素有“惊蛰吃梨”的习俗。惊蛰吃梨源于何时,无迹可寻,但祁县民间却有这...
初中演讲比赛规则? 初中演讲比赛规则?分为演讲选手规则,比如情绪饱满,仪表庄重,比赛规则,比如按照抽签顺序,评分规则去掉...
金色的鱼钩主要内容 金色的鱼钩主要内容这篇课文叙述了长征途中一位炊事班长接受党组织交给的任务,照顾三个生病的小战士过草地...
罗贯中在《三国演义》中使用昀独... 罗贯中在《三国演义》中使用昀独特的哪些手法?《三国演义》采用夸张手法表现人物形象。罗贯中在《三国演义...
呼吸困难是什么原因造成的? 呼吸困难是什么原因造成的?可能是由于鼻炎,造成鼻子不通气,在你呼吸的时候,自然就会感觉到呼吸困难,但...
比心怎么形容? 比心怎么形容?比心,网络流行词,也作“笔芯”,一种网络流行手势,指用双手比出一个爱心的形状,来表达对...
抽动症的症状,有哪些? 抽动症的症状,有哪些?我家孩子从小乖巧懂事,聪明伶俐,最近一段时间不知道怎么了,老是眨眼,耸肩,去医...
2-8人去张家界旅游团五天四晚... 最近我跟几个朋友计划了一趟张家界五天四晚的旅行,原本以为自由行最省心,结果发现行程安排、门票预订、交...
北京跟团游5天4晚旅游团,旅行... 北京,这座融合了古老与现代、传统与创新的城市,一直是我心中的向往之地。为了能让这次旅行更加顺利和充实...
什么是童年梦? 什么是童年梦?或者什么意思呢?》 回答: 代表着真爱,那是最纯洁的爱,要好好去追那个女孩,好好珍惜。...
“90版50元人民币”景色再现... 7月4日,受黄河上游水库泄洪的影响,位于秦晋峡谷的陕西黄河壶口瀑布迎来了今年最大水流量,瞬时水流量接...
哪部小说的章节是妈妈的秘密 哪部小说的章节是妈妈的秘密 奇迹的【和美女老师同居】第583章 妈妈的秘密