Mit einem synchronizedSet zur Synchronisation des Zugriffs zwischen zwei threads
Ich bin nicht in der Lage, zu synchronisieren, zwei threads mit einem Satz:
private Set<String> set;
...
set = Collections.synchronizedSet(new HashSet<String>());
und an zwei threads. Ein Zugriff auf:
synchronized (set) {
//[1]
if (set.contains(str)) {
...
} else {
//[3]
}
}
und ein weiteres Update:
synchronized (set) {
set.add(str); //[2]
...
}
Was passiert ist, dass [1], [2], [3] passiert in der Folge. Während [1], es ist richtig, dass das set nicht, habe aber den Artikel hab ich gesucht. Aber dann [2] aktualisiert es, indem Sie das Element hinzufügen. Und während Sie [3], jetzt sehe ich die Sache. Wie kann ich dieses Problem beheben? Ich habe auch eine ConcurrentHashMap teilen die gleichen threads, aber es funktioniert vollkommen in Ordnung. Was ist der Satz entspricht ConcurrentHashMAp?
UPDATE: Der code ist zu lang. Trotzdem, meine aktuelle Frage ist - Was ist der Satz entspricht ConcurrentHAshMap?
Stellen plz full-code-fragment. Diese synchronisierte Blöcke nicht laufen lassen, um zwei oder mehr threads gleichzeitig weder-set ist nicht synchronisiert nicht eingestellt ist thread-sicher.
Für debugging-Zwecke, drucken Sie die Identität der Satz in jedem thread mit download.oracle.com/javase/6/docs/api/java/lang/... um zu überprüfen, ob Sie beide mit der gleichen synchronisierten wrapper...
InformationsquelleAutor jasonline | 2011-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie synchronisieren, Zugang, richtig. Tatsächlich, wickelte Sie in
synchronizedSet()
ist nicht mit einer zusätzlichen Effekt hier. Es gibt keineConcurrentHashSet
aber Sie bekommen das gleiche ausCollections.newSetFromMap()
undConcurrentHashMap
. Aber das ist nicht das problem.Das problem ist woanders im code. Zum Beispiel: sind Sie sicher, dass Sie synchronisieren mit dem gleichen Satz? sind deine keys Umsetzung
hashCode()
undequals()
richtig? haben Sie machte Sie veränderlich (schlechte Idee) und etwas zu ändern ist der Schlüssel?InformationsquelleAutor Sean Owen