- Semaphore(信號量)屬于共享鎖的一種實現(xiàn)仇箱,可以指定多個線程同時訪問某個資源
- Semaphore 維持了一個可獲得許可證的數(shù)量乡范,經(jīng)常用于限制獲取某種資源的線程數(shù)量
- Semaphore 有兩種模式晋修,公平模式和非公平模式
public Semaphore(int permits) {//permits是許可數(shù)量,默認(rèn)非公平模式
sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {//fair為true時是公平模式
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
- acquire 獲取許可證颅围,可能阻塞直到有足夠的許可證
- release 增加許可證进宝,這可能會釋放一個阻塞的 acquire
semaphore.acquire(5);// 獲取5個許可
test(threadnum);
semaphore.release(5);// 釋放5個許可
- Semaphore將state視作許可證數(shù)量,看看源碼實現(xiàn)
abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 1192457210091910933L;
Sync(int permits) {
setState(permits);
}
final int getPermits() {
return getState();
}
final int nonfairTryAcquireShared(int acquires) {
for (;;) {
int available = getState();
int remaining = available - acquires;
if (remaining < 0 || //有足夠的許可
compareAndSetState(available, remaining))
return remaining;
}
}
protected final boolean tryReleaseShared(int releases) {
for (;;) {
int current = getState();
int next = current + releases;
if (next < current) // overflow
throw new Error("Maximum permit count exceeded");
if (compareAndSetState(current, next))
return true;
}
}
final void reducePermits(int reductions) {//減少許可
for (;;) {
int current = getState();
int next = current - reductions;
if (next > current) // underflow
throw new Error("Permit count underflow");
if (compareAndSetState(current, next))
return;
}
}
final int drainPermits() {//獲取并返回立即可用的所有許可個數(shù)寻咒,并且將可用許可置0
for (;;) {
int current = getState();
if (current == 0 || compareAndSetState(current, 0))
return current;
}
}
}