Является ли изменчивым всегда необходимым, когда к переменной обращаются несколько потоков (с записью только одного потоJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Является ли изменчивым всегда необходимым, когда к переменной обращаются несколько потоков (с записью только одного пото

Сообщение Anonymous »

Обычно рекомендуется использовать Летучий для переменной, которая записывается только одним потоком и может быть прочитана другим потоком в любое время. Причинами использования Летучих или метода синхронизации могут быть:
  • Компилятор может изменить порядок операторов.
  • Компилятор может загрузить переменную для регистрации при первом использовании, а затем повторно использовать ее как можно дольше.
  • И процессор может изменить порядок инструкций доступа к памяти.
Однако я все еще не уверен, стоит ли использовать изменчив в некоторых случаях. Рассмотрим следующий пример: мы определили обычную переменную Complete, начинающуюся с 0; Дочерний поток прочитает его через 5 мс, а основной поток сначала обновит значение.

Код: Выделить всё

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) {
}
}
Я думаю, что дочерний поток может прочитать окончательное значение завершения, то есть 1, Летучий здесь не нужен, я допустил ошибку? Могут ли какие-либо оптимизации компилятора или процессора повлиять на результат?

Подробнее здесь: https://stackoverflow.com/questions/781 ... threads-wi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»