AQS是什么?

发布时间 2023-08-11 02:21:29作者: optimjie

几个JUC里面的类

这里不做详细介绍,只是说明一下类的作用

ReentrantLock

是一种锁机制,实现多个线程在临界区中的同步访问。也就是说实现了:同一时间只有一个线程能进入临界区,其他线程需要等待。

如果自己实现ReentrantLock的话,需要考虑哪些点?

  1. 通过某个变量来确定当前是哪个线程在持有锁,同时因为ReentrantLock是可重入锁,那么还需要维护加锁的次数
  2. 对于没抢到的锁的线程,需要阻塞,同时当其他线程释放锁时需要被唤醒
  3. 由于可能同一时间内没有抢到锁的线程很多,所以需要一个集合去管理这些线程

CountDownLatch

可以实现线程在某个点上等待其他线程执行完成,比如:一个线程等待其他线程处理完再向下执行,多个线程等待一个线程执行完后再向下执行。

如果自己实现CountDownLatch的话,需要考虑哪些点?tip:通过用法来考虑

  1. 通过某个变量来确定等待的线程什么时候可以继续执行
  2. 如果CountDownLatch中的val还没有到0,那么调用await的线程需要阻塞,同时当val减为0时调用await的线程需要被唤醒,并向下执行
  3. 由于调用await的线程可能很多,所以需要一个集合去管理这些线程

Semaphore

锁可以保证同一时间只有一个线程向下执行,而Semaphore可以实现同一时间有n个线程向下执行,比如我想限制某一个时刻只有n个线程可以访问数据库。因此,Semaphore(1)可以理解为一个互斥锁。

如果自己实现Semaphore的话,需要考虑哪些点?tip:通过用法来考虑

  1. 需要有某个变量来确定,我这个线程能不能向下执行,这里其实就是permits
  2. 对于没拿到permit的线程,需要阻塞,同时当其他线程释放permit时需要被唤醒
  3. 由于没有拿到permit的线程可能很多,所以需要一个集合来去管理这些线程

其实到这里我们就会发现这三个类虽然功能不同,但是实现它们所需的东西其实是类似的,而这个“东西”就是大名鼎鼎的AQS。

你可能会说这里有点像根据答案来反推的,的确如此,但是通过这种方式是可以更好的理解为什么会有AQS的。

AQS提供了什么功能?

首先,AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器。【2】

它提供了(与上面三个类一一对应):

  1. 同步状态的原子性原理,即保证上面三个类变量的线程安全,因为有多个线程会同时修改该变量,AQS是通过CAS来实现的(为什么不用synchronized?)

参考

  1. 慕课网《玩转Java并发工具,精通JUC,成为并发多面手》
  2. https://www.pdai.tech/ Java并发编程部分