旗語我需要具有以下特徵的信號:不可重入無阻塞的Java
- 應該是非阻塞的,即如果線程不能獲得許可證 它應該走的更遠,而無需等待
- 它應該是不可重入,也就是說,如果同一個線程進入代碼的 把守一塊兩次應該拿走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();
}
}
是兩種實現線程安全的,對嗎? 哪一個更好? 你將如何去完成這項任務?
真的,tryAcquire方法是我所需要的,謝謝!但是,java.util.concurrent.Semaphore的再入口呢?我無法在文檔中找到任何證據表明一條線可能會拿出許多許可證。 – KutaBeach
它在文檔中說沒有跟蹤所有權,只是一個簡單的計數器,並且信號量可以從不同於獲取它的線程釋放。我認爲你的要求是由此而來的。 – Thilo