Ich möchte:ConcurrentHashMap: wie Sie den Wert eines Eintrags nur ersetzen, wenn der aktuelle Wert smalle ist
- einen Eintrag zu einem ConcurrentHashMap hinzufügen, wenn es keinen Eintrag für den Schlüssel ist, oder
- Ersetzen Sie den Wert für den Schlüssel nur, wenn der aktuelle Wert kleiner ist.
kam ich mit dem folgenden Code, aber Sinus hat while (true), es mir unheimlich aussieht :)
Ich wollte es mit euch überprüfen. Denkst du, es funktioniert?
// Input: map, k, t
while (true) {
if (map.containsKey(k)) {
current = map.get(k);
if (current != null && current < t) {
if (map.replace(k, current, t))
break;
} else if (current != null && current >= t) {
break;
}
} else {
pre = map.putIfAbsent(k, t);
if (pre == null)
break;
}
}
Haben Sie es versucht? Haben Sie es in Ihrem IDE-Debugger ausgeführt und durchlaufen Sie jeweils Zeile für Zeile? Bitte tun Sie das, es wird viel lehrreicher sein, als wenn Ihnen jemand davon erzählt. Und übrigens, es gibt keine Notwendigkeit für die "while (true)" (oder eine Schleife irgendeiner Art) überhaupt. –
Verwenden Sie 'Map.entrySet()' zum Iterieren –
@JimGarrison warum brauche ich nicht (wahr)? Angenommen ein Thread möchte t schreiben, aber die Map hat bereits den Schlüssel, also geht es zum ersten If. Wenn er ersetzt wird, gibt die Ersetzung den Wert false zurück, da der Wert sich in der Zwischenzeit durch einen anderen Thread auf einen Wert geändert hat, der höher als der aktuelle, aber kleiner als t ist. Da der Thread "t" schreiben möchte (da t höher ist), muss er von vorne beginnen. –