本文介紹了Java信號(hào)量最大?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
有沒有辦法知道信號(hào)量對(duì)象在其生命周期中曾經(jīng)擁有的最大許可數(shù)量?
我們按如下方式進(jìn)行初始化:
Semaphore sem = new Semaphore(n);
有時(shí)我們獲得,有時(shí)我們釋放我們所獲得的。但在某些情況下,我們需要發(fā)放比我們獲得的更多的許可證,以增加許可證的數(shù)量。有沒有辦法知道此信號(hào)量中曾經(jīng)出現(xiàn)過的最大許可數(shù)?
推薦答案
信號(hào)量本身不跟蹤其生存期內(nèi)的最大值。在它周圍實(shí)現(xiàn)一個(gè)跟蹤最大值的Semphore包裝器可能會(huì)很棘手。下面是這樣一個(gè)實(shí)現(xiàn)的快速草稿:
public final class MySemaphore {
private final Semaphore semaphore;
private final AtomicReference<MaxCounter> maxCounter = new AtomicReference<>();
public MySemaphore(int initialAvailable) {
this.semaphore = new Semaphore(initialAvailable);
maxCounter.set(new MaxCounter(initialAvailable, initialAvailable));
}
private static final class MaxCounter {
private final int value;
private final int max;
public MaxCounter(int value, int max) {
this.value = value;
this.max = max;
}
public MaxCounter increment() {
return new MaxCounter(value + 1, Math.max(value + 1, max));
}
public MaxCounter decrement() {
return new MaxCounter(value - 1, max);
}
public int getValue() {
return value;
}
public int getMax() {
return max;
}
}
public void acquire() throws InterruptedException {
semaphore.acquire();
for (;;) {
MaxCounter current = maxCounter.get();
if (maxCounter.compareAndSet(current, current.decrement())) {
return;
}
}
}
public void release() {
for (;;) {
MaxCounter current = maxCounter.get();
if (maxCounter.compareAndSet(current, current.increment())) {
break;
}
}
semaphore.release();
}
public int availablePermits() {
return maxCounter.get().getValue();
}
public int getMaximumEverAvailable() {
return maxCounter.get().getMax();
}
}
MaxCounter可能與內(nèi)部使用的信號(hào)量不完全同步。內(nèi)部信號(hào)量可以獲得從外部角度被處理為獲取/釋放的釋放/獲取。MySemaphore的每個(gè)客戶端,盡管行為將是一致的。即availablePermits()
永遠(yuǎn)不會(huì)返回大于getMaximumEverAvailable()
的值
免責(zé)聲明:代碼未測試*
這篇關(guān)于Java信號(hào)量最大?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,