Können wir für jeden Eintrag Synchronized anstelle von ConcurrentHashMap verwenden?

Das ist das Problem: Wir wollen eine Hash-Tabelle, deren Einträge threadsicher sind.

Angenommen, ich habe eine Hash-Tabelle von<String, Long>, und ich möchte den Wert eines der Einträge Thread sicher erhöhen: ist das folgende OK?:

HashMap<String , Long> hashTable = new HashMap<String, Long>();

Immer dann, wenn ich einen Eintrag erhöhen möchte:

Synchronized (hashTable.get("key"))
{
    Long value = hashTable.get("key");
    value++;
    hashTable.put("key", value);
}

Ich denke, es ist besser als ConcurrentHashMap, da es nur einen Eintrag sperrt, im Gegensatz zu ConcurrentHashMap, das Buckets verwendet und eine Gruppe von Einträgen zusammen sperrt.

Mehr wichtig, ich weiß nicht, wie ich es mit COncurrenHashMap sicher inkrementieren kann. Zum Beispiel denke ich, dass der folgende Code nicht korrekt ist:

 ConcurrentHashMap<String , Long> hashTable = new ConcurrentHashMap<String, Long>();


 Long value = hashTable.get("key");
 value++;
 hashTable.put("key", value);

Ich denke, es ist nicht korrekt, weil zwei Threads den Schlüssel nacheinander lesen und nacheinander schreiben können und am Ende einen falschen Wert haben.

Was denkt ihr Leute

Antworten auf die Frage(2)

Ihre Antwort auf die Frage