Java8 потоки последовательного и параллельного выполнения дают разные результаты?

Выполнение следующего примера потока в Java8:

    System.out.println(Stream
        .of("a", "b", "c", "d", "e", "f")
        .reduce("", (s1, s2) -> s1 + "/" + s2)
    );

выходы:

/a/b/c/d/e/f

Что, конечно, не удивительно. Из-заhttp://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html не должно иметь значения, выполняется ли поток последовательно или параллельно:

За исключением операций, определенных как явно недетерминированные, такие как findAny (), независимо от того, выполняется ли поток последовательно или параллельно, результат изменения не должен изменяться.

насколько мне известноreduce() является детерминированным и(s1, s2) -> s1 + "/" + s2 является ассоциативным, так что добавлениеparallel() должен дать тот же результат:

    System.out.println(Stream
            .of("a", "b", "c", "d", "e", "f")
            .parallel()
            .reduce("", (s1, s2) -> s1 + "/" + s2)
    );

Однако результат на моей машине:

/a//b//c//d//e//f

Что здесь не так?

Кстати: использование (предпочтительнее).collect(Collectors.joining("/")) вместоreduce(...) дает тот же результатa/b/c/d/e/f для последовательного и параллельного исполнения.

Детали JVM:

java.specification.version: 1.8
java.version: 1.8.0_31
java.vm.version: 25.31-b07
java.runtime.version: 1.8.0_31-b13

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

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