当前位置: 代码迷 >> 综合 >> 并发进阶之AQS(Semaphore、CountDownLatch和Reentranlock)
  详细解决方案

并发进阶之AQS(Semaphore、CountDownLatch和Reentranlock)

热度:21   发布时间:2023-12-28 03:39:52.0

目录

  • 1、锁和协作类的共同点:闸门
    • 1.1 Semaphore和AQS的关系
    • 1.2 AQS的职责
  • 1.3 AQS三要素
    • 1.3.1 State状态
    • 1.3.2 等待队列
    • 1.3.3 方法


1、锁和协作类的共同点:闸门

在这里插入图片描述

因为上面的那些协作类,他们有很多 工作都是类似的,所以如果能提取一个工具类,那么就可以直接用,对于ReentrantLock和Semaphore而言就可以屏蔽很多细节,只关注他们自己的业务逻辑就可以了

1.1 Semaphore和AQS的关系

在这里插入图片描述

sync是Semaphore的一个内部类,继承于AQS,ReentrantLock、CountDownLatch也是一样的,所以这些类和AQS是包含关系

1.2 AQS的职责

如果没有AQS,就需要每个协作工具自己实现:

  • 同步状态的原子性管理,
  • 线程的阻塞与解除阻塞,
  • 队列的管理

在并发场景下,自己正确且高效实现这些内容,是相当有难度的,所以我们用AQS来帮我们把这些脏活累活都搞定,我们只关注业务逻辑就可以了

总结:有了AQS以后,构建协作类就方便多了
AQS是一个用于构建锁、同步器、协作工具类的工具类(工具)。有了AQS以后,更多的协作工具类都可以很方便的被写出来

在这里插入图片描述

  • 并发包中多数类都和AQS相关

1.3 AQS三要素

在这里插入图片描述

1.3.1 State状态

  • volatile state int
    在这里插入图片描述

这里有具体的含义,他根据具体实现类的不同而不同
在Semaphore里,他表示 “剩余的许可证数量”,而在CountDownLatch中,表示"还需倒数的数量"

  • AQS源码:

在这里插入图片描述

在ReentrantLock中,state用来表示锁的占有情况,state为0代表Lock不被任何线程所占有,state为1或大于1(可重入锁)表示被占有

1.3.2 等待队列

在这里插入图片描述

在队列中,head是目前已经拿到锁的线程,后面是阻塞的等待锁的线程

在这里插入图片描述

1.3.3 方法

第三个是期望协作工具类去实现的获取/释放等重要方法,这里的获取和释放方法,是利用AQS的协作工具类里最重要的方法,是由协作类自己去实现的,并且含义不相同

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  相关解决方案