Semaphore简单分析

6月 21st, 2016 2,059 留下评论 阅读评论

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队列。

 

Categories: Java 标签:
  1. 还没有评论呢。