Я играл со своей собственной версией, используя "if", и все, кажется, работают нормально. Конечно, это будет разрушаться ужасно, если вместо signal() используется signalAll(), но если уведомление об одном только за один раз, как это может пойти не так?
Их код здесь - проверьте методы 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();
}
}
P.S. Я знаю, что в целом, особенно в классах lib, подобных этому, нужно позволить исключениям просачиваться вверх.