- Компилятор может изменить порядок операторов.
- Компилятор может загрузить переменную для регистрации при первом использовании, а затем повторно использовать ее как можно дольше.
- И процессор может изменить порядок инструкций доступа к памяти.
Код: Выделить всё
int completed;
void readFlag() {
System.out.println("Read completed value: " + completed);
}
public void testViolatile() {
var executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(this::readFlag, 5, TimeUnit.MILLISECONDS);
completed = 1; # update will happen before the read
// cleanup
executor.shutdown();
try {
executor.awaitTermination(10, TimeUnit.MILLISECONDS);
} catch (InterruptedException ignored) {
}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... threads-wi
Мобильная версия