慢慢熟悉 AQS
AQS 的用法:
-
以 CountDownLatch 为例:
CountDownLatch , 闭锁,用于等待多个并发任务都完成后再执行其他任务。
初始化 new CountDownLath(int count), 给闭锁的初始数目设为count, 当count 减为0 时,闭锁就打开了.提供两个方法:
void countDown(), 将锁中的数目减一。
void await(), 锁未开(count 不为0)则阻塞直至锁开,否则直接返回。CountDownLatch 的实现:
CountDownLatch 中的 Sync
实现了AQS 的两个方法 int tryAcquireShared(arg);
boolean tryReleaseShared(int releases);
CountDownLatch 调用了AQS 的 void acquireSharedInterruptibly(int arg);
和 boolean releaseShared(int arg);
首先明确状态:
- AQS 中的 state 就是初始设置的count, 那么当count 为0 时,不需阻塞,相当于获取共享资源成功。当锁不到0时,相当于获取共享资源失败。
- 1 中的逻辑可以帮助实现await, 什么时候阻塞,什么时候方法返回。
- 对于每个调用 countDown 的线程,要保证只要count>0,都能将原来值减一。且count 为0时, 要唤醒阻塞队列的第一个线程。