1 AQS 简介
- AQS 为抽象锁队列,它内部引入了一个锁队列,并实现了获取锁队列失败后线程的入队列操作和成功释放锁后,唤醒队列下一个节点线程的出队列操作
- AQS 也提供了获取和释放锁的模板,子类只要实现获取/释放锁(tryAcquire/tryRelease)的逻辑,就可以实现一个完成的锁,如 ReentrantLock、ReentrantReadWriteLock
- AQS、ReentrantLock、ReentrantReadWriteLock 结构与源码分析 一文中 分析了AQS 的结构
2 Semaphore 简介
- 需求分析:一个旅游景区,当人数达到额定值时,就不能在放入进去了,出来一个人才能进去一个人
- 概要设计:AQS 正好可以实现上面的需求
- 可将 state 变量设为额定值(state 表示剩余的可获取的资源)
- 当一个线程获取锁成功后,将 state - 1。释放锁成功后,将 state + 1
- 当 state < = 0 时,表示没有资源了,获取资源的线程将被挂起
2.1 Semaphore 设计
- 以下即是最简洁的 Semaphore 所需要的核心代码,自己实现的仅仅只有 tryAcquireShared()、tryReleaseShared()。其余的部分都被 AQS 实现了,可见 AQS 的强大。
public class MySemaphore {
private Sync sync;
public MySemaphore(int permits) {
this.sync = new Sync(permits);
}
public void acquire() {
sync.acquireShared(1);}
public void release() {
sync.releaseShared(1);}
static class