は私が持っている他のオブジェクト(sessionCollection)が含まれていて、私は次の反復操作を行う必要がありConcurrentHashMap
サブスクリプション:sessionCollection.removeAllSubscriptionsOfSession
は内部(もConcurrentHashMap
)のコレクションを介して別の反復操作を行いConcurrentHashMapsでアトミックネストされた反復操作を行う方法は?
subscriptions.values().forEach(sessionCollection ->
sessionCollection.removeAllSubscriptionsOfSession(sessionId));
を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));
}
この全体的な手順はオミック操作?
synchronizedMapはクライアント側のロックをサポートしているので、Collections.synchronizedMapを使用してマップ自体で同期することもできます。パフォーマンスはConcurrentHashMapよりもはるかに悪くなります。マップ全体がロックされていることを確認するかどうかは、ロジックにとって実際に重要かどうかを判断する必要があります。そうしないと、マップ全体をロックする以外に選択肢がありません。多くの場合、この種のロックは不要です。 –
私は同意します、 'SynchronizedMap.forEach()'は同期バッチ更新を実行するのに使用できます。技術的には、私が記述したものと同じラッパーになりますが、操作の意味はありません。 –