volatile переменная атомарная или нет?

Почему операции над volatile переменными не атомарны?

upd: Переменная помеченная volatile является атомарной или нет?


Ответы (2 шт):

Автор решения: EvgeniiVolkov

volatile обеспечивает только видимость (visibility) изменений, к атомарности он не имеет отношения. Классический пример со счетчиком: допустим есть поле volatile int i, к которому мы применим инкремент (декремент), возможна ситуация, когда два разных потока сначала проведут инкремент (декремент), а потом оба заберут результат двух инкрементов (декрементов). Такое воможно, потому что операции инкремента (декремента) не атомарны, а фактически состоят из последовательности операций, хотя и записываются одним выражением: i++ например.

→ Ссылка
Автор решения: Ilya Yarets

Кратко:

Мой вопрос оказался некорректным. Переменная помеченная ключевым словом volatile является атомарной для чтения и записи. Операции над переменной помеченной volatile НЕ являются атомарными

Подробно:

Атомарная операция выглядит единой и неделимой командой процессора, которая может быть или уже выполненной или ещё невыполненной.

Если переменную сделать volatile, то запись и чтение происходит атомарно. НО если, происходит какая-то операция, например, инкримент, то уже атомарность не обеспечивается, потому что это сначала выполняется чтение(1), потом изменение(2) в локальной памяти, а затем запись(3). Такая операция не является атомарной и в неё может вклиниться поток по середине.

→ Ссылка