title: Reduce for parallel stream without combiner executes by several threads correctly. When should I use combiner at this case?
body: <p>I have read following about:</p>
  
  <p><a href="https://stackoverflow.com/a/22814174/2674303">https://stackoverflow.com/a/22814174/2674303</a></p>
  
  <p>and I made resolution that combiner uses only in parallel stream for correct merge accumulator results. one accumulator instance on each thread.</p>
  
  <p>Thus I made resolution that reduce without combiner will not work correctly.</p>
  
  <p>To check this I have wrote following example:</p>
  
  <pre><code>   Person reduce = Person.getPersons().stream()
                  .parallel() 
                  .reduce(new Person(), (intermediateResult, p2) -&gt; {
                      System.out.println(Thread.currentThread().getName());
                      return new Person("default", intermediateResult.getAge() + p2.getAge());
                  });
          System.out.println(reduce);
  </code></pre>
  
  <p>model:</p>
  
  <pre><code>public class Person {
  
      String name;
  
      Integer age;
      ///...
  
      public static Collection&lt;Person&gt; getPersons() {
          List&lt;Person&gt; persons = new ArrayList&lt;&gt;();
          persons.add(new Person("Vasya", 12));
          persons.add(new Person("Petya", 32));
          persons.add(new Person("Serj", 10));
          persons.add(new Person("Onotole", 18));
          return persons;
     }
  }
  </code></pre>
  
  <p>As you can see I don't provide combiner<br>
  sample output:</p>
  
  <pre><code>ForkJoinPool.commonPool-worker-3
  ForkJoinPool.commonPool-worker-2
  ForkJoinPool.commonPool-worker-1
  ForkJoinPool.commonPool-worker-2
  ForkJoinPool.commonPool-worker-1
  ForkJoinPool.commonPool-worker-1
  Person{name='default', age=72}
  </code></pre>
  
  <p>I have executed application several times and always I see correct result.</p>
  
  <p>Please, explain how does reduce working for parallel stream if combiner is not provided.</p>