Ответ
Atomic классы (например, AtomicInteger, AtomicBoolean) полезны, когда нужно обеспечить атомарные операции над примитивами в многопоточной среде без блокировок. Основные случаи:
- Счётчики – когда несколько потоков инкрементируют/декрементируют значение:
val counter = AtomicInteger(0)
fun increment() = counter.incrementAndGet()
- Флаги – для безопасного изменения boolean-значений:
val isRunning = AtomicBoolean(false)
fun stop() = isRunning.set(false)
- Одноразовые операции – например, ленивая инициализация:
private val initialized = AtomicBoolean(false)
fun initOnce() {
if (initialized.compareAndSet(false, true)) {
// инициализация
}
}
Используйте Atomic вместо synchronized, когда нужны простые атомарные операции – это даёт лучшую производительность. Для сложных операций (например, проверка-действие) всё ещё может потребоваться synchronized или другие механизмы синхронизации.