Thread Safe of Operation in einem Eintrag - Java, Multithreading, Parallelität, java.util.concurrent, Concurrenthashmap

Ich möchte Operationen wie machen

class A {
}

ConcurrentHashMap<A, Integer> map = new ConcurrentHashMap<>();

public void fun() {
Integer count = map.get(Object);
if (count != null) {
map.put(Object, count+1);
}
}
public void add() {
// increase Object count by 1
}
public void remove() {
// deduct Object count by 1
}

Wie kann ich Spaß machen () Thread sicher?

Ich weiß, dass man einen synchronisierten Block hinzufügen kann

public void fun() {
synchronized("") {
Integer count = map.get(Object);
if (count != null) {
map.put(Object, count+1);
}
}
}

Aber gibt es andere Möglichkeiten, es zu tun? Oder gibt es Bibliotheken dafür?

wie threadsicherer Einstiegsprozessor?


Ich möchte auch etwas wie implementieren

public void remove() {
int count = map.get(Object);
count -= 5;
if (count <= 0) {
map.remove(Object);
} else {
map.put(Object, count + 2);
}
}

Any ways to do this  ?
Thank you

Antworten:

-1 für die Antwort № 1

Benutzen AtomicInteger und GleichzeitigeHashMap.putIfAbsent ()

Sieh dir auch die ConcurrentHashMap.remove (Schlüssel, Wert) - Entfernt den Schlüssel nur, wenn er dem angegebenen Wert zugeordnet ist.

Ich bin mir nicht sicher, ob es möglich ist, die exakte Logik zu implementieren (was in der obigen Frage nicht gut definiert ist), aber diese Methoden könnten sehr nützlich sein, um etwas Ähnliches zu tun.

Weitere Hinweise (die nützlich oder vielleicht nicht zu viel sind):

Sie (wahrscheinlich!) Können Methoden verwenden: computeIfAbsent, computeIfPresent (oder replace) und remove (key, value). ConcurrentHashMap könnte für Werte in Integer definiert werden.

Es wird eine sehr schmutzige Lösung sein, und ich empfehle es nicht, sie zu benutzen, aber als etwas, worüber man nachdenken könnte, könnte es sehr herausfordernd sein.

Lass es mich wissen, wenn du weitere Hinweise brauchst.


Speisekarte