Это очень хороший вопрос. Существует не существует простого решения. Я найду некоторый код, который я недавно написал, чтобы попытаться это сделать, и вернусь и отредактирую этот ответ.
РЕДАКТИРОВАТЬ: Я вернулся. Действительно, если вам не нужен параллелизм, вам лучше поддерживать очередь и набор отдельно. Для того, что я делал, параллелизм был целью, но лучшее решение, которое я мог придумать, учитывая, что ограничение было проблематичным; в основном, поскольку он использовал ConcurrentHashMap, чем больше вы удаляете элемент «head» из очереди (основное, что нужно сделать с очередью), тем более несбалансированной будет хеш-таблица со временем. Я все еще могу поделиться этим кодом с вами, но я сомневаюсь, что вы действительно этого хотите.
РЕДАКТИРОВАТЬ: Для случая, когда требуется параллелизм, я дал такой ответ:
Очередь одновременных наборов