次の機能を備えたセマフォが必要です。
- ノンブロッキングである必要があります。つまり、スレッドが許可を取得できない場合は、待機せずに先に進む必要があります
- 再入不可にする必要があります。つまり、同じスレッドが保護されたコードに 2 回入る場合、1 つではなく 2 つの許可を取得する必要があります。
私は次のコードを書きました:
public class SimpleSemaphore
{
private int permits;
private AtomicLong counter = new AtomicLong();
SimpleSemaphore(int permits)
{
this.permits = permits;
}
boolean acquire()
{
if (counter.incrementAndGet() < permits)
{
return true;
}
else
{
counter.decrementAndGet();
return false;
}
}
void release()
{
counter.decrementAndGet();
}
}
別のオプションは、このセマフォです。
public class EasySemaphore
{
private int permits;
private AtomicLong counter = new AtomicLong();
EasySemaphore(int permits)
{
this.permits = permits;
}
boolean acquire()
{
long index = counter.get();
if (index < permits)
{
if (counter.compareAndSet(index, index + 1))
{
return true;
}
}
return false;
}
void release()
{
counter.decrementAndGet();
}
}
どちらの実装もスレッドセーフで正しいですか? どちらの方がよいですか?このタスクをどのように進めますか?