При создании многопоточной программы я столкнулся с проблемой: метод удаления ConcurrentLinkedDeque был вызван двумя потоками и вызвал исключение. Я могу решить проблему, синхронизируя этот метод, как в этом коде, но я ищу решение без синхронизации. Я искал другие подходящие структуры, но не нашел ни одной, которая бы не генерировала исключение или не ожидала повторного заполнения очереди.
public void releaseVehicle(DeliveryVehicle vehicle) {
acquireTable.put(vehicle.getLicense(), true);
synchronized (futureQueue) {
if (!futureQueue.isEmpty())
futureQueue.remove().resolve(vehicle);
}
}
мне любопытно, есть ли другой способ?




Вместо этого вы можете использовать poll. Поскольку ConcurrentLinkedDeque не допускает элементов null, poll, возвращающий null, означает, что двухсторонняя очередь пуста (на момент вызова).
SomeClass element;
while ((element = deque.poll()) != null) {
// do something with element
}