Правильно ли говорить, что волатильный примитив:
1) Требуется синхронизация для неатомных операций. 2) Не требуется синхронизация для атомных операций, например:
volatile bool selector;
selector = true;
Если вы просто переназначаете изменчивую переменную, она не требует синхронизации. Это идея, стоящая за ними.
Фактически, в этом случае он даже не должен быть изменчивым, потому что новое значение true
не зависит от старого значения selector
поэтому не имеет значения, был ли он изменен другим потоком.
По документации Oracle Java:
Чтения и записи являются атомарными для всех переменных, объявленных volatile (включая длинные и двойные переменные).
Значение/назначение использования декларации volatile такое же, как использование блока synchronize
. Нет, вам не нужно синхронизировать доступ к изменчивой переменной
Что касается компромисса между ними, то в той же документации говорится:
Использование простого доступа к атомной переменной более эффективно, чем доступ к этим переменным через синхронизированный код, но требует больше внимания программиста, чтобы избежать ошибок согласованности памяти. Независимо от того, стоит ли дополнительное усилие, зависит размер и сложность приложения.
bool
- это C ++;boolean
- это Java.