Por qué usar flujos paralelos en el inicializador estático conduce a un punto muerto no estable
PRECAUCIÓN no es un duplicado, lea el tema сarefully https: //stackoverflow.com/users/3448419/apangi cita:
La verdadera pregunta es por qué el código a veces funciona cuando no debería. El tema se reproduce incluso sin lambdas. Esto me hace pensar que podría haber un error de JVM.
En los comentarios dehttps: //stackoverflow.com/a/53709217/267430 Traté de averiguar las razones por las cuales el código se comporta de manera diferente de un comienzo a otro y los participantes de esa discusión me dieron un consejo para crear un tema separado.
No consideremos el siguiente código fuente:
public class Test {
static {
System.out.println("static initializer: " + Thread.currentThread().getName());
final long SUM = IntStream.range(0, 5)
.parallel()
.mapToObj(i -> {
System.out.println("map: " + Thread.currentThread().getName() + " " + i);
return i;
})
.sum();
}
public static void main(String[] args) {
System.out.println("Finished");
}
}
A veces (casi siempre) conduce a un punto muerto.
Ejemplo de salida:
static initializer: main
map: main 2
map: ForkJoinPool.commonPool-worker-3 4
map: ForkJoinPool.commonPool-worker-3 3
map: ForkJoinPool.commonPool-worker-2 0
Pero a veces termina con éxito (muy raro):
static initializer: main
map: main 2
map: main 3
map: ForkJoinPool.commonPool-worker-2 4
map: ForkJoinPool.commonPool-worker-1 1
map: ForkJoinPool.commonPool-worker-3 0
Finished
static initializer: main
map: main 2
map: ForkJoinPool.commonPool-worker-2 0
map: ForkJoinPool.commonPool-worker-1 1
map: ForkJoinPool.commonPool-worker-3 4
map: main 3
¿Podrías explicar ese comportamiento?