Domanda

Brian Goetz di scritto un bell'articolo su fork-join a http://www.ibm. com / developerWorks / java / library / j-jtp03048.html . In esso, egli elenca un algoritmo merge sort utilizzando il meccanismo fork-join, in cui si esegue l'ordinamento su due lati di un array in parallelo, quindi fonde il risultato.

L'algoritmo classifica i due differenti sezioni della stessa matrice simultaneamente. Perché non è un AtomicIntegerArray o qualche altro meccanismo necessario per mantenere la visibilità? Che garanzia c'è che un thread vedrà le scritture fatte dagli altri, o si tratta di un bug in modo sottile? Come un follow-up, non ForkJoinScheduler di Scala anche rendere questa garanzia?

Grazie!

È stato utile?

Soluzione

Il join (di ForkJoin) stesso richiede un punto di sincronizzazione, questo è il pezzo più importante di informazioni. Un punto di sincronizzazione farà in modo che tutte le scritture che accadono sono dopo visibili detto punto.

Se si dà un'occhiata al codice si può vedere dove si verifica il punto di sincronizzazione. Questo è solo un metodo di chiamata invokeAll

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

Qui t2 forchette in un altro processo, t1 esegue il suo compito e che chiamare filo attenderà sul t2.join (). Quando si passa t2. Tutte le scritture T1 e T2 saranno quindi visibili.

Modifica:. Questa modifica è solo per dare un po 'più di una spiegazione di ciò che intende per punto di sincronizzazione

Consente di dire che si hanno due variabili

int x;
volatile int y;

Ogni volta che si scrive a y tutte le scritture che è accaduto prima di leggere y sarà disponibile. Ad esempio

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

Se un altro filo y = 5 legge quel filo è garantita per leggere x = 10. Questo perché la scrittura di y crea un punto di sincronizzazione in cui tutte le scritture prima detto punto sarà visibile dopo la scrittura.

Con la forcella Registrazione piscina il join di un ForkJoinTask creerà un punto di sincronizzazione. Ora, se t2.fork () e t1.invoke () l'unione di t2 farà in modo che tutte le scritture che in precedenza è accaduto si vedrà. Dal momento che tutte le operazioni di scrittura precedenti sono all'interno della stessa struttura sarà sicuro per la visibilità.

sarei felice di spiegare ulteriormente se quello non è il più chiaro.

Altri suggerimenti

Solo una supposizione:. Merge include unirsi a un filo, e il join garantisce la visibilità

La seconda parte è sicuro; Io non so come si fondono implementata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top