AQS 介绍
AQS 的全称为 AbstractQueuedSynchronizer ,是一个抽象类,主要用来构建锁和同步器。
- 用
volatile修饰的变量state表示同步状态- 通过 CAS 操作进行状态值更新
- 只有 state 为 0 的时候(即锁未被占用),才能获取锁
- 如果是可重入锁,每次重新获取会将 state 累加,这也意味着,一个线程必须释放与获取的次数相同的锁,才能让
state的值回到 0 - 对于
CountDownLatch就是 state 初始为 N,N 个子线程执行结束后将 state-1,所有执行完毕,state 就是 0,这时唤醒主线程(类似于 go 的 group)
通过内置的 FIFO 线程等待/等待队列 来完成获取资源线程的排队工作。
- 资源共享方式
- 独占:只有一个线程能执行,如
ReentrantLock- 可以理解为写锁
- 共享:多个线程可同时执行,如
Semaphore/CountDownLatch- 可以理解为读锁
- 独占:只有一个线程能执行,如
常见同步工具类
- Semaphore(信号量):允许特定数量的线程访问资源
- 可以设置为公平(FIFO)和非公平(抢占)模式,默认非公平
- 等待的线程自旋获取锁
- CountDownLatch (倒计时器):允许特定数量线程阻塞在同一个地方,直到所有线程执行完毕
- 一次性的,使用完毕后不能再次被使用
- 注意不要产生泄露(少于指定数量的线程执行)
- CyclicBarrier(循环栅栏)
