Потоки по своей природе параллельны друг другу . Это означает, что два (или более) потока соревнуются за один и тот же ресурс (ЦП), когда они выполняются одновременно, и ЦП переключается с выполнения одного на другой в случайном (непредсказуемом) порядке. Вы не можете и не будете знать, на какой путь выполнения (поток) ваш процессор и архитектура ОС решат перейти. Более того, на некоторых языках это может быть вопрос архитектуры ОС , на некоторых - только архитектуры ЦП , а на некоторых - обоих . Это зависит от того, как архитектура этого языка управляет потоками.
Обратите внимание, что даже если два потока параллельны - т.е. они выполняются параллельно на двух разных ядрах - вы все равно не можете предсказать, какое ядро сначала выполнит инструкцию.
Из-за вышеперечисленных пунктов вы можете получать другой порядок выполнения вашего кода, каждый раз, вы запускаете его.