Por que usar fluxos paralelos no inicializador estático leva a um conflito não estável
CUIDADO não é uma duplicata, leia o tópico сarfully https: //stackoverflow.com/users/3448419/apangi quote:
A verdadeira questão é por que o código às vezes funciona quando não deveria. O problema se reproduz mesmo sem lambdas. Isso me faz pensar que pode haver um bug da JVM.
Nos comentários dehttps: //stackoverflow.com/a/53709217/267430entei descobrir os motivos pelos quais o código se comporta de maneira diferente de um começo para o outro e os participantes dessa discussão me deram conselhos para criar um tópico separad
Não vamos considerar o seguinte código fonte:
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");
}
}
s vezes (quase sempre) leva a um impass
Exemplo de saída:
static initializer: main
map: main 2
map: ForkJoinPool.commonPool-worker-3 4
map: ForkJoinPool.commonPool-worker-3 3
map: ForkJoinPool.commonPool-worker-2 0
Mas às vezes termina com sucesso (muito 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
o
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
Você poderia explicar esse comportamento?