La unión (de ForkJoin) en sí misma requiere un punto de sincronización, esa es la información más importante. Un punto de sincronización asegurará que todas las escrituras que suceden sean visibles después de dicho punto.
Si echa un vistazo al código, puede ver dónde se produce el punto de sincronización. Esta es sólo una llamada al método invokeAll
public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
t2.fork();
t1.invoke();
t2.join();
}
Aquí se bifurca en otro proceso t2, t1 ejecuta su tarea y que llamar hilo esperará en t2.join(). Al pasar t2. Todas las escrituras en t1 y t2 serán visibles.
Editar: Esta edición es solo para dar un poco más de una explicación de lo que quiero decir con el punto de sincronización.
supongamos que usted tiene dos variables
int x;
volatile int y;
Cuando se escribe a y todas las escrituras que ocurrieron antes de leer y estarán disponibles. Por ejemplo
public void doWork(){
x = 10;
y = 5;
}
Si otro hilo lee y = 5 ese hilo es garantizado leer x = 10. Esto se debe a la escritura a y crea un punto de sincronización en el que todas las escrituras antes de dicho punto será visible después de la escritura.
Con la agrupación Fork Join, la combinación de ForkJoinTask creará un punto de sincronización. Ahora si t2.fork() y t1.invoke() la unión de t2 asegurará que se verán todas las escrituras que ocurrieron previamente. Como todas las escrituras anteriores están dentro de la misma estructura, será seguro para la visibilidad.
Estaré encantado de seguir explicando si eso no está tan claro.
Están funcionando en diferentes secciones de la matriz. No hay disputa hasta que se trata de fusionarse. –
Acepto que operan en diferentes secciones. Pero la semántica del modelo de memoria de Java dice más o menos que no todos los hilos tienen la garantía de ver todas las escrituras (a menos que la variable sea volátil). De acuerdo con este blog: http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html incluso el uso de una volátil int [] no es suficiente para garantizar que otros subprocesos vean tus escrituras en la matriz –