Frage

Brian Goetz 'schrieb einen schönen Artikel über Fork-Join bei http://www.ibm.com/developerworks/java/library/j-jtp03048.html. Darin listet er einen Merge-Sort-Algorithmus unter Verwendung des Fork-Join-Mechanismus auf, in dem er die Sortierung auf zwei Seiten eines Arrays parallel ausführt und dann das Ergebnis verschmilzt.

Der Algorithmus sortiert gleichzeitig auf zwei verschiedenen Abschnitten desselben Arrays. Warum ist ein AtomicintegerArray oder ein anderer Mechanismus nicht erforderlich, um die Sichtbarkeit aufrechtzuerhalten? Welche Garantie gibt es, dass ein Thread die von dem anderen geschriebenen Schreibvorgänge sehen wird, oder ist dies ein subtiler Fehler? Macht Scalas ForkjoinScheduler diese Garantie auch?

Vielen Dank!

War es hilfreich?

Lösung

Der Join (von Forkjoin) selbst erfordert einen Synchronisationspunkt, das ist die wichtigste Information. Ein Synchronisationspunkt wird sicherstellen, dass alle geschehenen Schreibvorgänge nach diesem Punkt sichtbar sind.

Wenn Sie sich den Code ansehen, können Sie sehen, wo der Synchronisationspunkt auftritt. Dies ist nur eine Methode Call InvokeAll

public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
    t2.fork();
    t1.invoke();
    t2.join();
}

Hier geht T2 in einen anderen Prozess auf, T1 führt seine Aufgabe aus und dieser aufrufende Thread wartet auf T2.Join (). Beim Übergeben von T2. Alle Schreibvorgänge an T1 und T2 werden dann sichtbar sein.

Bearbeiten: Diese Bearbeitung soll nur etwas mehr Erklärung dafür geben, was ich mit Synchronisationspunkt gemeint habe.

Nehmen wir an, Sie haben zwei Variablen

int x;
volatile int y;

Jedes Mal, wenn Sie an y schreiben, werden alle geschrieben, die passiert sind, bevor Sie gelesen haben, werden verfügbar sein. Zum Beispiel

public void doWork(){
   x = 10;
   y = 5;
}

Wenn ein anderer Thread Y = 5 liest, ist dieser Thread garantiert Zum Lesen von x = 10. Dies liegt daran, dass das Schreiben in Y einen Synchronisationspunkt erstellt, in dem alle Schreibvorgänge vor diesem Punkt nach dem Schreiben sichtbar sein werden.

Mit dem Pool der Fork Join Pool wird die Verbindung eines Forkjointaskasks einen Synchronisationspunkt erzeugt. Wenn t2.fork () und t1.invoke () die Verbindung von T2 sicherstellen, wird sichergestellt, dass alle Schreibvorgänge zuvor geschehen sind. Da alle vorherigen Schreibvorgänge innerhalb derselben Struktur liegen, ist es für die Sichtbarkeit sicher.

Ich würde gerne weiter erklären, wenn das nicht so klar ist.

Andere Tipps

Nur eine Vermutung: Zusammenführung beinhaltet die Beitritts an einem Thread, und das Join garantiert die Sichtbarkeit.

Der zweite Teil ist sicher; Ich weiß nicht, wie Merge implementiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top