Das folgende Stück Code funktioniert nicht wie erwartet. Wenn ich die Put-Methode in Does-Klasse aufruft, wird der Wert in der Concurrent-Hash-Map mit verschiedenen Instanzen der Map verknüpft. Was ich versuche, ist, dass mehrere Threads auf dieselbe Map zugreifen und einen Wert für den gleichen Key einfügen. Wenn ich jedoch ein synchronisiertes Schlüsselwort zur Put-Methode hinzufüge, funktioniert es. Was vermisse ich?Einfügen in eine gleichzeitige Hash-Map
class Does implements Runnable {
C2 c2;
Does(C2 c2) {
this.c2 = c2;
}
public void run() {
c2.put("Hello");
}
}
public class C2 {
public ConcurrentHashMap<String, List<String>> map = new ConcurrentHashMap<String, List<String>>();
public static void main(String args[]) {
C2 c2 = new C2();
new Thread(new Does(c2)).start();
new Thread(new Does(c2)).start();
new Thread(new Does(c2)).start();
new Thread(new Does(c2)).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
List<String> lu = c2.map.get("Hello");
System.out.println(lu);
}
/**
* @param string
*/
public void put(String string) {
if (map.containsKey(string)) {
List<String> li = map.get(string);
li.add("adding something");
} else {
List<String> li = new ArrayList<String>();
li.add("adding something");
map.put(string, li);
}
}
}
Schätzen Sie die Hilfe.
Was funktioniert nicht wie erwartet? Es ist möglich, dass alle 4 Threads erkennen, dass die Karte den Schlüssel nicht enthält, und dann versuchen, sie hinzuzufügen. – ck1
Ja, aber die Put-Methode gilt als Thread-sicher für gleichzeitige Hash-Map. also ich vermute, das sollte kein problem sein? – Krish