Semaphore简单分析
java.util.concurrent.Semaphore
AQS实现的一个变种,用来预先设置一个阈值(可进入量),然后当做类似共享锁的方式地进行acquire和release,但是每次acquire不记录当前acquire的线程对象(这是Semaphore和Lock最大的区别)
,即线程A操作的acquire可以由线程B来release。也有公平和非公平两种方式。
一般用在管理一个对象池,设置初始容量N,每次getObject就acquire,每次returnObject就release,因为没有对对象池本身采用任何同步加锁代码,即使线程A的acquire在阻塞中,线程B的release依然可以进行。
Semaphore的最大容量也可以动态增加,可以通过release和release(int n)持续扩大容量(即使没有任何线程进行acquire)(虽然API名称上不直观)。
AQS的代码解析见:可重入锁、ReentrantLock、AQS、Condition
reducePermits和nonfairTryAcquireShared的区别在于,reducePermits不管减少容量后的state值是多少(可以为负值)阻塞等待CAS完成,nonfairTryAcquireShared则需要判断减少容量后的state值是正值则阻塞等待CAS完成,负值则返回acquire失败回到AQS中加入Sync队列。