Возможно, вам удастся просто проверить / удалить / вставить без дополнительных блокировок:
class DroppingQueue<E>
extends ArrayBlockingQueue<E> {
public boolean add(E item) {
while (! offer(item)) {
take();
}
return true;
}
}
Несмотря на то, что этот метод не синхронизирован, add
и offer
все еще остаются, поэтому самое худшее, что может произойти, это то, что поток # 1 вызовет offer
, обнаружит, что очередь заполнена, поток # 2 выполнит То же самое, и оба будут удалять элементы, временно уменьшая количество элементов до значения меньше максимального, прежде чем оба потока успешно добавят свои элементы. Это, вероятно, не вызовет серьезных проблем.