Несоответствие ожидаемому результату работы IntStream
Разбираюсь в многопоточности, дошёл до класса Phaser. Встретил пример.
Phaser phaser = new Phaser();
IntStream.range(0, 3).forEach(i -> {
phaser.register();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " " + phaser);
}).start();
});
Вывод работы этого кода:
Thread-1 java.util.concurrent.Phaser@42b4d62c[phase = 0 parties = 3 arrived = 0]
Thread-0 java.util.concurrent.Phaser@42b4d62c[phase = 0 parties = 3 arrived = 0]
Thread-2 java.util.concurrent.Phaser@42b4d62c[phase = 0 parties = 3 arrived = 0]
Сразу parties = 3 да и ещё в первой строке вывода. Думал будет reg() sout ,reg() sout, reg() sout() и parties = 1, parties = 2, parties = 3.
Искал в интернете(в т.ч. и в англоязычном) - ближе всего объяснение такого поведения в "планировщике", а там зарылся и тупик.
Может в не в ту степь пошёл: пробовал менять местами строки в этом куске кода, чтобы увидеть логику - безрезультатно.
Объясните, откуда программа знала, что parties = 3 до выполнения всего цикла (0,3)?