为了理解计数信号量的工作原理,我决定实现一个简单的版本。 我想验证我当前的实现实际上是一个正确的实现并且我没有遗漏任何明显的东西
public class CountingSemaphore {
private int limit;
public CountingSemaphore(int limit) {
this.limit = limit;
}
public synchronized void acquire() {
try {
if (limit == 0)
wait();
limit--;
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void release() {
try {
if(limit == 0)
notifyAll();
limit++;
}catch(Exception e) {
e.printStackTrace();
}
}
}
最佳答案
除一个细节外,这应该有效。
由于您使用了 notifyAll()
,(正如@JBNizet 指出的那样,由于虚假唤醒的风险,)您可以唤醒多个等待线程,所有这些都将被释放并减少 限制
。
改变
if (limit == 0)
wait();
到
while (limit == 0) {
wait();
}
你应该没问题。
关于java - 简单计数信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571648/