Ответ
Нет, volatile не гарантирует атомарность операций инкремента/декремента. Он лишь обеспечивает видимость изменений между потоками, но не защищает от race condition.
Для атомарных операций используйте AtomicInteger или синхронизацию:
// Неправильно (race condition)
@Volatile
var counter = 0
counter++ // Не атомарно!
// Правильно (атомарно)
val atomicCounter = AtomicInteger(0)
atomicCounter.incrementAndGet()
Или с синхронизацией:
val lock = Any()
var counter = 0
fun increment() {
synchronized(lock) {
counter++
}
}
volatile подходит только для простых операций записи/чтения одного значения.