AQS

101 阅读2分钟

AQS是什么?

AQS,全程是abstract queue synchronize。翻译过来意思是抽象的同步队列。是一个实现阻塞锁和依赖FIFO等待队列的同步容器框架。

AQS作用?

一个不是很恰当的例子,篮球比赛,篮球只能被一个球员持有(多人同时触到球,争抢过程成为竞争)。

AQS,是用来实现阻塞锁的。如独占锁、共享锁,解决并发场景的问题。

AQS 设计思想

共享资源 共享资源,大家都都可以来使用,但是在并发场景下,只能有一个人使用,如果是独占的方式,A使用了,B和C只能等,A不再使用了,释放了。此时B和C均有机会获取到使用权。

等待队列 在竞争某个共享资源时候,没有获取到共享资源的,则在一个队列中进行等待。

AQS 实现原理

AQS内部,维护一个共享资源 state,和 一个 CLH 队列。

state 是具有 volatile 语义的,当state=1 表示获得了锁,此时其他线程加锁会失败,加锁失败的线程必须进入等待,这些等待的线程被放到 CLH 队列中,处CLH 队列,满足FIFO 。

不同的实现,对state的使用是不一样的,如ReentrantLock(可冲、重入锁),表示持有锁的线程已经持有了多少次,

当持有锁的线程释放了锁,则其他等下线程会被唤醒,重新开始竞争锁资源。

基于 AQS 实现的同步组件

AQS,的具体实现有2中方式,公平的方式实现锁,以及非公平的方式显示锁。

juc中实现了AQS的具体组件如下

ReentrantLock

ReentrantReadWriteLock

Semaphore

CountDownLatch

AQS的实际使用情况

ThreadPoolExecutor 中的工作先出,Worker 使用了AQS 。

CAS

ABA 问题