Если я понимаю правило порядка выполнения программы (каждое действие в потоке происходит перед каждым действием в этом потоке, которое происходит позже в порядке выполнения программы)
Нет.
Здесь у вас не один поток, а два потока: основной поток и поток, созданный и запущенный основным потоком:
Thread t = new Thread() {...};
t.start();
А живые потоки JVM по своей природе параллельны.
Если бы два оператора были выполнены в одном и том же потоке, можно было бы с уверенностью предположить, что выведенное значение будет равно «1». Но если два оператора выполняются в отдельных потоках, выводимое значение вполне может быть «0», потому что нет гарантии, что изменение потока A на счетчик будет видно потоку B, если только программист не установил отношение «происходит до» между эти два утверждения.
Отношение "происходит до" возникает только в том случае, если все операторы выполняются одним и тем же потоком или если вы явно создаете отношение "происходит до".
Выдержка из учебника по ошибкам непротиворечивости памяти:
Есть несколько действий, которые создают отношения «случается раньше». Одним из них является синхронизация, как мы увидим в следующих разделах.
Как сказано выше, операторы выполняются двумя потоками.
И вы не синхронизируете операторы явно.
Таким образом, между потоками возникает состояние гонки, и, как правило, порядок выполнения следует рассматривать как непредсказуемый. . Теперь на практике для такого короткого оператора: x = y + 1
:
t.start();
x = y + 1;
Назначение операции добавления настолько короткое, что может быть выполнено, поскольку весьма вероятно, что это произойдет до того, как поток, на который ссылается t
, будет эффективно запущен.
Кроме того, современные ЦП имеют несколько ядер.
Таким образом, если у ЦП есть доступные потоки, основной поток не будет приостановлен, чтобы запустить новый поток.
Таким образом, два потока будут выполняться "в одно и то же время".
Но поскольку x = y + 1;
выполняется гораздо быстрее при запуске и запуске потока, первый оператор может завершиться только раньше второго.
person
davidxxx
schedule
27.01.2018