ВНИМАНИЕ: это не является дубликатом, пожалуйста, прочитайте тему сarefully https://stackoverflow.com/users/3448419/apangin цитата:
Реальный вопрос заключается в том, почему код иногда работает, когда он не должен. Выпуск воспроизводится даже без лямбд. Это заставляет меня думать, что может быть ошибка JVM.
В комментариях на qaru.site/info/16721153/... я попытался выяснить причины, по которым код ведет себя по-разному при старте, и участники этого обсуждения дали мне совет создать отдельную тему.
Давайте рассмотрим следующий исходный код:
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");
}
}
Иногда (почти всегда) это приводит к тупику.
Пример вывода:
static initializer: main
map: main 2
map: ForkJoinPool.commonPool-worker-3 4
map: ForkJoinPool.commonPool-worker-3 3
map: ForkJoinPool.commonPool-worker-2 0
Но иногда это заканчивается успешно (очень редко):
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
Не могли бы вы объяснить это поведение?