AQS基础
Semaphore是一种共享锁,实现依赖于AQS。对于锁,包含两部分知识,一部分是如何加解锁,另一部分是把锁分配给谁。AQS解决了把锁分配给谁的问题,Semaphore就可以聚焦于如何加解锁上。
掌握AQS将使Semaphore如何运转变得非常简单,没掌握也不影响对于本文的理解。
AQS原理可以参考:一文了解AQS
这里,需要了解AQS是如何运转的:
- 当申请锁,即调用了与acquire()类似语义的方法时,AQS将询问子类是否上锁成功,成功则继续运行。否则,AQS将以Node为粒度,记录这个申请锁的请求,将其插入自身维护的CLH队里中并挂起这个线程
- 在CLH队列中,只有最靠近头节点的未取消申请锁的节点,才有资格申请锁
- 当线程被唤醒时,会尝试获取锁,如果获取不到继续挂起;获取得到则继续运行
- 当一个线程释放锁,即调用release()类似语义的方法时,AQS将询问子类是否解锁成功,有锁可以分配,如果有,AQS从CLH队列中主动唤起合适的线程,过程为2、3
- 如果需要等待条件满足再去申请锁,即调用了wait()类似语义的方法时,在AQS中表现为,以Node为粒度,维护一个单向等待条