Правило правила программы: "Каждое действие в потоке происходит - перед каждым действием в этом потоке, которое приходит позже в порядке выполнения программы"
1.I прочитал в другой поток, что действие
- читает и записывает в переменные
- блокировки и разблокировки мониторов
- начало и соединение с потоками
Означает ли это, что чтение и запись могут быть изменены по порядку, но чтение и запись не могут изменить порядок с действиями, указанными во 2-й или 3-й строках?
2. Что означает "порядок программы"?
Объяснение с примерами будет действительно полезно.
Дополнительный связанный вопрос
Предположим, что у меня есть следующий код:
long tick = System.nanoTime(); //Line1: Note the time
//Block1: some code whose time I wish to measure goes here
long tock = System.nanoTime(); //Line2: Note the time
Во-первых, это однопоточное приложение, которое упрощает задачу. Компилятор замечает, что ему нужно дважды проверять время, а также замечает блок кода, который не имеет зависимости от окружающих строк с указанием времени, поэтому он видит потенциал для реорганизации кода, что может привести к тому, что Block1 не будет окружен вызовами времени во время фактического выполнения (например, рассмотрите этот порядок Line1- > Line2- > Block1). Но я, как программист, вижу зависимость между Line1,2 и Block1. Строка 1 должна немедленно предшествовать Блоку 1, Блок 1 принимает конечное количество времени для завершения и сразу же преуспевает в Line2.
Итак, мой вопрос: правильно ли я измеряю блок?
- Если да, то что мешает компилятору переупорядочить порядок.
- Если нет, (что считается правильным после прохождения ответа Enno), что я могу сделать, чтобы предотвратить его.
P.S.: Я украл этот код из другого вопроса, который я недавно спросил в SO.