В чем разница между Volatile и Atomic типами

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

Ответ

volatile гарантирует видимость изменений переменной для всех потоков, но не обеспечивает атомарность операций. Например, инкремент volatile int не будет атомарным.

Atomic классы (например, AtomicInteger) обеспечивают и видимость, и атомарность операций за счет использования CAS (Compare-And-Swap) операций процессора.

// Небезопасно с volatile
@Volatile
var counter = 0
fun unsafeIncrement() {
    counter++ // Не атомарная операция
}

// Безопасно с Atomic
val atomicCounter = AtomicInteger(0)
fun safeIncrement() {
    atomicCounter.incrementAndGet() // Атомарная операция
}

Используйте volatile для простых операций чтения/записи, а Atomic - для сложных атомарных операций.