Можно ли использовать volatile для инкрементации и декрементации

«Можно ли использовать volatile для инкрементации и декрементации» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, 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 подходит только для простых операций записи/чтения одного значения.