0

Ich habe Thread A Aufrechterhaltung einer Datenstruktur (Hinzufügen, Löschen, Ändern von Werten in einem ConcurrentHashMap).Hat ein neuer Thread die volle Speichersichtbarkeit der vorherigen Aktionen aller anderen Threads für gemeinsam genutzte Objekte?

Ich habe Gewinde B auf einem Socket hören und gelegentlich Gewinde C Schaffung eine neue Client-Verbindung zu behandeln.

Alle Gewinde C s nur jemals von der ConcurrentHashMap gehalten by thread A (nie aktualisieren) gelesen.

Ist Gewinde C garantiert alle Updates zu sehen, die by thread A, auf dem ConcurrentHashMap, vor dem Faden C wurde erstellt/started by thread B durchgeführt wurden?

(Edited letzte Satz Frage klarer zu machen. Nur um Aktualisierungen der ConcurrentHashMap)

+0

Ja, vorbehaltlich der Vorkehrungen vor dem Java Memory Model * (q.v.) *. Grundsätzlich müssen Sie sicherstellen, dass jeder Zugriff "synchronisiert" oder der "java.util.concurrent" entspricht. – EJP

Antwort

1

Ist Thread C garantiert, alle Updates zu sehen, die von Thread A durchgeführt wurden, bevor Thread C von Thread B erstellt/gestartet wurde?

Im Allgemeinen (zum Beispiel mit einer gewöhnlichen HashMap), Nr

aber (wieder im Allgemeinen), wenn Gewinde C by thread A erstellt wurde, dann wäre die Antwort ja sein.

(Es gibt ein passiert-vor Beziehung zwischen einem Thread start() auf einem Thread-Objekt aufrufen, und den Beginn des run() Methode des neuen Thread. Aber Sie haben ein drittes Gewinde eingeführt ... und haben nichts beschrieben, dass würde Ihnen eine passiert vor Kette von A nach B zu C.

)

aber Sie sprechen von einem ConcurrentHashMap hier, und gleichzeitig Karten haben angeborene Speicher Konsistenz:

„Memory Konsistenz Auswirkungen: Wie bei anderen gleichzeitigen Sammlungen, Aktionen in einem Thread vor dem Platzieren ein Objekt in eine ConcurrentMap als Schlüssel oder Wert passieren vor Aktionen nach dem Zugriff oder Entfernen dieses Objekts von der ConcurrentMap in einem anderen Thread. "

(Von den ConcurrentMapjavadoc.)

für alles Also, wo mehrere Threads ein ConcurrentHashMap ein Read-Only-Thread teilen garantiert Updates sehen durch ein anderes gemacht ... Modulo das dokumentierte Verhalten von Iteratoren.

+0

Vielen Dank für diese umfassende Antwort. Meine Frage wurde schlecht formuliert, ich hätte Thread C nur aus der ConcurrentHashMap lesen sollen, anstatt zu fragen, ob irgendwelche Updates sichtbar gewesen wären (was mögliche Updates für nicht gleichzeitige Objekte impliziert). – RonR

+0

Ich hatte das schon vermutet. –

1

Ja, wie in docs angegeben:

Retrievals die Ergebnisse der letzten abgeschlossenen Aktualisierung widerspiegeln Operationen, die von Anfang an anhalten. (Formal ein Update Betrieb für einen bestimmten Schlüssel trägt ein geschieht zuvor Beziehung mit jedem (nicht null) Retrieval für diesen Schlüssel des aktualisierten Wertes Berichterstattung.)

1

Ja, wenn das ConcurrentHashMap Objekt geteilt wird global oder übergeben/geteilt an/mit thread C.

1

Ihre Phrase

by thread A durchgeführt, bevor der Thread C wurde durch Thread B erstellt/gestartet?

befasst sich mit einem schlecht definierten Konzept, da Java Memory Model keine Garantien auf der Grundlage der zeitlichen Reihenfolge bietet. Sie müssen sicherstellen, dass eine passiert-vor Bestellung entweder durch Programmauftrag oder durch Synchronisationsreihenfolge und Sie scheinen weder zu tun.

Also, um Ihre Frage mit "Nein" zu beantworten, wäre falsch, weil die Frage eine falsche versteckte Annahme hat.

1

Ich bin neu dazu, ich möchte etwas hinzufügen, Dariusz meinst du nicht für aktualisierte Werte können wir flüchtige Modifikator verwenden.

Korrigieren Sie mich, wenn ich falsch bin volatile Variablen geben immer ihren aktualisierten Wert zurück.

Verwandte Themen