volatile переменная атомарная или нет?
Почему операции над volatile переменными не атомарны?
upd: Переменная помеченная volatile является атомарной или нет?
Ответы (2 шт):
volatile обеспечивает только видимость (visibility) изменений, к атомарности он не имеет отношения. Классический пример со счетчиком: допустим есть поле volatile int i, к которому мы применим инкремент (декремент), возможна ситуация, когда два разных потока сначала проведут инкремент (декремент), а потом оба заберут результат двух инкрементов (декрементов). Такое воможно, потому что операции инкремента (декремента) не атомарны, а фактически состоят из последовательности операций, хотя и записываются одним выражением: i++ например.
Кратко:
Мой вопрос оказался некорректным. Переменная помеченная ключевым словом volatile является атомарной для чтения и записи.
Операции над переменной помеченной volatile НЕ являются атомарными
Подробно:
Атомарная операция выглядит единой и неделимой командой процессора, которая может быть или уже выполненной или ещё невыполненной.
Если переменную сделать volatile, то запись и чтение происходит атомарно. НО если, происходит какая-то операция, например, инкримент, то уже атомарность не обеспечивается, потому что это сначала выполняется чтение(1), потом изменение(2) в локальной памяти, а затем запись(3). Такая операция не является атомарной и в неё может вклиниться поток по середине.