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 问题