AQS系列之AbstractQueuedSynchronizer基础分析
AQS系列之以排斥锁分析
AQS系列之共享锁解析
AQS系列之共享锁的应用解析:Semaphore
一、简介
Semaphore即信号量,常用于同时限制访问某些资源的线程数量。
其内部抽象类Fair继承了AQS,Semaphore正是通过Sync实现数量的控制
1. Sync
Semaphore是基于AQS原理实现的,但并不是说Semaphore继承了AbstractQueuedSynchronizer抽象类,而是其内部类进行了AbstractQueuedSynchronizer的继承,Semaphore通过内部类实现,后续其他几个AQS的应用同样也是如此。
具体到Semaphore,内部类Sync继承了AQS,而且Sync同样的也只是个抽象类,具体有氛围两个策略:公平锁(FairSync)和非公平锁(UnFairSync),两者的区别是对于竞争资源的线程是否严格遵守先到先得的公平策略。
Semaphore默认使用非公平锁。
2. state
Sync的state代表可以同时访问的线程数量,也可能理解为访问的许可证(permit)数量。每个线程访问(acquire)时需要拿到对应的许可证,否则进行阻塞,访问结束则返还(release)许可证。
state只能在Semaphore的构造方法中进行初始化,后续不能进行修改。
3. 对外方法
上图整理了Semaphore方法,主要是了解其思路,不是细究提供了哪些api。AQS其他应用类的一些方法思路也差不多,虽然命名可以有一定差异。后续在对其他类解析时不会再整理一次。
二、资源获取acquire
根据前面几篇文章对AQS的解析,共享锁不同应用类的核心逻辑实在其对AbstractQueuedSynchronizer的protected int tryAcquireShared(int acquires)的重写上。
state代表剩余的permit数量,只要state大于acquire则说明资源满足本线程所需,获取成功,否则失败。
1. 非公平锁
public boolean tryAcquire(int permits) {
if (permits