为什么java.util.concurrent.ArrayBlockingQueue使用'while'循环而不是'if'围绕对 await()的调用?
我一直在玩我自己的版本,使用“if”,一切似乎都很好。当然,如果使用signalAll()而不是signal(),这将严重崩溃,但是如果一次只通知一个线程,这怎么会出错呢?
他们的代码在这里 - 查看 put() 和 take() 方法;一个更简单、更切中要害的实现可以在 JavaDoc for Condition 的顶部看到。
下面是我实现的相关部分。
public Object get() {
lock.lock();
try {
if( items.size() < 1 )
hasItems.await();
Object poppedValue = items.getLast();
items.removeLast();
hasSpace.signal();
return poppedValue;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
} finally {
lock.unlock();
}
}
public void put(Object item) {
lock.lock();
try {
if( items.size() >= capacity )
hasSpace.await();
items.addFirst(item);
hasItems.signal();
return;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
附言:我知道一般来说,特别是在像这样的lib类中,人们应该让异常渗透进来。