A execução sequencial e paralela dos fluxos Java8 produz resultados diferentes?

Executando o seguinte exemplo de fluxo no Java8:

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

rendimentos:

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

O que é claro - não é surpresa. Devido ahttp://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html não importa se o fluxo é executado sequencialmente ou em paralelo:

Exceto para operações identificadas como explicitamente não determinísticas, como findAny (), se um fluxo é executado sequencialmente ou em paralelo não deve alterar o resultado da computação.

Até onde seireduce() é determinístico e(s1, s2) -> s1 + "/" + s2 é associativo, de modo que adicionarparallel() deve produzir o mesmo resultado:

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

No entanto, o resultado na minha máquina é:

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

O que há de errado aqui?

BTW: usando (o preferido).collect(Collectors.joining("/")) ao invés dereduce(...) produz o mesmo resultadoa/b/c/d/e/f para execução sequencial e paralela.

Detalhes da 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

questionAnswers(3)

yourAnswerToTheQuestion