пожалуйста это очень простой пример:Волатильность и безопасность потоков в Java
volatile int globalVar = 1;
Мой поток:
if (globalVar > 0) {
globalVar--;
}
Теперь я должен решить, следует ли сделать переменную летучий достаточно для предотвращения гонки -condition и сделать эту нить безопасной.
Я знаю, что инкрементирование и декретирование не является, но я не уверен, что это другое, из-за предыдущего условия.
Я думаю, что это до сих пор не является безопасным, потому что это может быть выполнено в следующем порядке:
Thread проверяет состояние. Thread B проверяет состояние. Поток A увеличивается. Поток B увеличивается.
Я прав?
Это не единственная причина; только декрементирование не является потокобезопасным. – SLaks
Вам нужно думать о 'globalVar -' как загрузке потока globalVar, вычитая один из результата и записывая новое значение в globalVar, три отдельных операции. –