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?

1->2->3 sollte nicht passieren. 1->3 ist gegenseitig auf 2. Das ist, wenn 1 aufgerufen wird, 2 sollte nie aufgerufen werden, bis nach 3 aufgerufen wird (wenn 3 aufgerufen wird).
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

Schreibe einen Kommentar