Что лучше использовать при изменении переменной из разных потоков Volatile, Atomic или synchronized

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

Ответ

Для изменяемых переменных из разных потоков лучше использовать Atomic классы (например, AtomicInteger), так как они обеспечивают атомарность операций без блокировок.

synchronized гарантирует потокобезопасность, но может снижать производительность из-за блокировок.

volatile обеспечивает видимость изменений между потоками, но не атомарность сложных операций (например, инкремента).

Пример:

private val counter = AtomicInteger(0)

fun increment() {
    counter.incrementAndGet() // атомарная операция
}

Выбор зависит от сценария:

  • Atomic — для простых атомарных операций
  • synchronized — для сложных блоков кода
  • volatile — только если переменная пишется в одном потоке, а читается в других