会飞的汤姆猫

V1

2022/09/22阅读:47主题:绿意

AQS简介

AQS是什么?

public abstract class AbstractQueuedSynchronizer
    extends AbstractOwnableSynchronizer
    implements java.io.Serializable 
{
}

锁和协作类有共同点:阀门功能

ReentrantLock 和Semaphore,二者之间有没有什么共同点?

其实它们都可以当做一个阀门来使用。比如我们把 Semaphore 的许可证数量设置为 1,那么由于它只有一个许可证,所以只能允许一个线程通过,并且当之前的线程归还许可证后,会允许其他线程继续获得许可证。其实这点和 ReentrantLock 很像,只有一个线程能获得锁,并且当这个线程释放锁之后,会允许其他的线程获得锁。那如果线程发现当前没有额外的许可证时,或者当前得不到锁,那么线程就会 被阻塞,并且等到后续有许可证或者锁释放出来后,被唤醒,所以这些环节都是比较类似的。

CountDownLatch、ReentrantReadWriteLock 等工具类都有类似的让线程协作的功能,其实它们背后都是利用 AQS 来实现的。

为什么需要AQS?

原因是,上面刚讲的那些协作类,它们有很多工作是类似的,所以如果能把实现类似工作的代码给提取出来,变成一个新的底层工具类(或称为框架)的话,就可以直接使用这个工具类来构建上层代码了,而这个工具类其实就是 AQS。

有了 AQS 之后,对于 ReentrantLock 和 Semaphore 等线程协作工具类而言,它们就不需要关心这么多的线程调度细节,只需要实现它们各自的设计逻辑即可。

如果没有AQS?

每个线程协作工具至少需要自己实现:

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

这里的状态对于不同的工具类而言,代表不同的含义,比如对于 ReentrantLock 而言,它需要维护锁被重入的次数,但是保存重入次数的变量是会被多线程同时操作的,就需要进行处理,以便保证线程安全。对于那些未抢到锁的线程,还应该让它们陷入阻塞,并进行排队,并在合适的时机唤醒。所以说这些内容其实是比较繁琐的,而且也是比较重复的,而这些工作目前都由 AQS 来承担了。

AQS 是一个用于构建锁、同步器等线程协作工具类的框架

分类:

后端

标签:

后端

作者介绍

会飞的汤姆猫
V1