什么是Semaphore
Semaphore的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是比较常用的一个工具类。
Semaphore的构造方法:
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
permits参数代表许可线程的数量
fair表示公平性,如果这个设为true的话,下次执行的线程是等待最久的线程
//获取许可
public void acquire() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
//available 允许访问的线程数目
//acquires默认是1
protected int tryAcquireShared(int acquires) {
for (;;) {
if (hasQueuedPredecessors())
return -1;
int available = getState();
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining))
return remaining;
}
}
//此方法表示释放许可
public void release() {
sync.releaseShared(1);
}
public final boolean releaseShared(int arg) {
//调用tryReleaseShared尝试释放共享锁,这里必须实现为线程安全
if (tryReleaseShared(arg)) {
//释放成功,必定调用doReleaseShared尝试唤醒后继结点
doReleaseShared();
return true;
}
return false;
}
使用场景
资源访问,进行限流(Hystrix的限流的使用)