Когда поток читает значение примитива (кроме long и double) или ссылки на объект, он видит значение, которое он установил в этой переменной, или значение, которое другой поток установил в этой переменной.
Однако, хотя присвоение значения общей переменной в одном потоке является атомарным, это не означает, что все остальные потоки увидят новое значение сразу после.Для этого переменная должна быть объявлена как volatile.volatile также делает записи в длинные и двойные атомные.Однако в этом случае я предпочитаю использовать AtomicXxx (AtomicLong, AtomicBoolean и т. Д.).
И если вы хотите атомарно изменить значения двух общих переменных, вам следует синхронизировать каждый доступ (чтение и запись) кэти переменные используют уникальную блокировку.
Более того, каждая операция «проверяй потом действуй» или «читай потом записывай» неатомарна.Это означает, что эти операции также нуждаются в синхронизации:
a++; // read a, increment value, write value to a
if (a > 0) {a = b;} // check value of a, then assign new value to a.
Каждая отдельная операция в вашем вопросе является атомарной.Но в setValue()
у вас есть две атомарные операции.Весь вызов setValue
не является атомарным.