Verschachtelte synchronisierte Map - Java, Multithreading

Wie kann ich Elemente sicher einfügen?

ConcurrentMap <String, Set<Integer>> cmap = new ConcurrentMap<String, Set<Integer>>();

Ich arbeite auf meiner Concurrent Map wie folgt:

  • Wenn ein Schlüssel nicht existiert: Setzen Sie einen Eintrag mit einem String und einem brandneuen Set<Integer>
  • Wenn es existiert: füge einen bestimmten hinzu Integer zu diesem Schlüssel "s Set<Integer> Wert.

Antworten:

3 für die Antwort № 1

ConcurrentMap verfügt über eine Methode zum Initialisieren des Kartenwerts, wenn dieser fehlt. Ich nehme an, dass auch das Set drinnen sicher sein sollte:

Set<Integer> set = cmap.computeIfAbsent(key,(k)->  Collections.newSetFromMap(new ConcurrentHashMap<>()));

set.add(value);

Vor Lambda:

    Set<Integer> set = cmap.get(key);
if (set == null) {
set = Collections.newSetFromMap(new ConcurrentHashMap<>());
Set<Integer> prev = cmap.putIfAbsent(key, set);
if (prev != null) {
set = prev;
}
}
set.add(value);

0 für die Antwort № 2

In einer gleichzeitigen Umgebung sollten Sie wahrscheinlich gleichzeitige Karten und gleichzeitige Sets verwenden. Beispielsweise ConcurrentHashMap, und Collections.newSetFromMap(new ConcurrentHashMap<>()). Das ConcurrentHashMap.putIfAbsent() Methode verhindern Race - Bedingung von if(!containsKey) put Mechaniker.

So wird der Code aussehen

public void add(String s, Integer i) {
cmap.putIfAbsent(s, Collections.newSetFromMap(new ConcurrentHashMap<>()));
Set<Integer> set = cmap.get(s);
set.add(i);
}

Verwandte Fragen
Speisekarte