一度実行したいコールバックがある状況があります。議論のために、次のように見えるとしましょう。
final X once = new X(1);
Runnable r = new Runnable() {
@Override public void run() {
if (once.use())
doSomething();
}
}
ここで、X は、次の動作を行う並行オブジェクトです。
コンストラクタ: X(int N) -- N 個の使用許可を割り当てます
boolean use()
: 使用許可が 1 つでもある場合、そのうちの 1 つを消費して true を返します。それ以外の場合は false を返します。この操作は、複数のスレッドに関してアトミックです。
これにはjava.util.concurrent.Semaphoreを使用できることはわかっていますが、ブロッキング/待機の側面は必要ないため、これを 1 回限りの使用にしたいと考えています。
私が何かをしない限り、AtomicIntegerは十分に見えません
class NTimeUse {
final private AtomicInteger count;
public NTimeUse(int N) { this.count = new AtomicInteger(N); }
public boolean use() {
while (true)
{
int n = this.count.get();
if (n == 0)
return false;
if (this.count.compareAndSet(n, n-1))
return true;
}
}
while ループにうんざりします。
countDown() メソッドには戻り値がなく、getCount() を使用してアトミックに実行できないため、CountDownLatch は機能しません。
セマフォを使用するだけですか、それともより適切なクラスがありますか?