Я пытаюсь решить проблему, которая кажется мне довольно распространенной, но я не смог найти для нее хорошего решения.
В очень параллельной среде мне нужно правильно высвобождать ресурсы, когда сеанс клиента разрушается.Вот входные данные:
- Я использую
ConcurrentHashMap
для хранения всех выделенных ресурсов, здесь требуется карта для индексации ресурсов - Когда сеанс уничтожается, иногда новые ресурсы выделяются из ожидающих задач, который я хочу, в конечном счете, также освободить
Вот мое текущее решение:
while (!resourceMap.isEmpty()) {
Map<Integer, Resource> toDestroy = new HashMap<>(resourceMap);
for (Resource resource : toDestroy.values()) {
resource.destroy();
}
resourceMap.keySet().removeAll(toDestroy.keySet());
}
, которое существует только потому, что ConcurrentHashMap#values#iterator
не всегда отражает параллельные путы к resourceMap
.Мне не нравится этот код, и я предпочел бы код, подобный очереди, но, к сожалению, ConcurrentMap
не предоставляет ничего подобного:
while ((Map.Entry<String, Resource> entry = resourceMap.removeAny()) != null) {
entry.value().destroy();
}
Я ищу решение, похожее на код, подобный очереди, приведенный выше, илилюбые альтернативные подходы к этой проблеме.