У меня есть ConcurrentHashMap
подписок, которые содержат другой объект (sessionCollection), и мне нужно сделать следующую итерационную операцию:Как сделать атомарную итеративную операцию на ConcurrentHashMaps?
subscriptions.values().forEach(sessionCollection ->
sessionCollection.removeAllSubscriptionsOfSession(sessionId));
где sessionCollection.removeAllSubscriptionsOfSession
делает другую итерационную операцию над коллекцией (также ConcurrentHashMap
) внутри sessionCollection:
// inside SessionCollection:
private final ConcurrentHashMap<String, CopyOnWriteArrayList<String>> topicsToSessions =
new ConcurrentHashMap<>();
public void removeAllSubscriptionsOfSession(String sessionId) {
// Remove sessions from all topics on record
topicsToSessions.keySet().forEach(topicSessionKey ->
removeTopicFromSession(sessionId, topicSessionKey));
}
что бы шаги, чтобы сделать это в общем зачете омическая операция?
Вы также можете использовать Collections.synchronizedMap и синхронизировать на самой карте, так как synchronizedMap поддерживает блокировку на стороне клиента. Однако производительность будет намного хуже, чем ConcurrentHashMap. Вам нужно решить, действительно ли важно, чтобы вся карта была заблокирована, действительно важна для вашей логики, если тогда нет выбора, кроме как заблокировать всю карту. Во многих случаях такая блокировка не нужна. –
Согласен, 'SynchronizedMap.forEach()' может использоваться для выполнения синхронизированных пакетных обновлений. Технически это будет тот же самый обертку, как я описал, но без семантики операций. –