, Это исправлено в следующих выпусках: JDK 8u201, JDK 11.0.2 и JDK 12.

НИЕ: это не дубликат, пожалуйста, прочитайте темусarefully https://stackoverflow.com/users/3448419/apangin цитата:

Реальный вопрос заключается в том, почему код иногда работает, когда он не должен. Выпуск воспроизводится даже без лямбд. Это заставляет меня думать, что может быть ошибка JVM.

В комментарияхhttps://stackoverflow.com/a/53709217/2674303 Я попытался выяснить причины, по которым код ведет себя по-разному от одного начала к другому, и участники этого обсуждения дали мне совет создать отдельную тему.

Давайте не будем рассматривать следующий исходный код:

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

Не могли бы вы объяснить это поведение?

Ответы на вопрос(1)

Ваш ответ на вопрос