Что будет с программой если не синхронизировать обращение к переменной

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

Ответ

Если обращение к переменной не синхронизировано в многопоточной среде, возможны race conditions (состояние гонки). Это может привести к:

  1. Потере данных – один поток может перезаписать изменения другого.
  2. Некорректным значениям – чтение переменной во время её изменения другим потоком.
  3. Проблемам с видимостью – изменения одного потока могут быть не видны другим из-за кеширования.

Пример:

var counter = 0

fun increment() {
    counter++ // Небезопасно в многопоточной среде
}

Решение – использовать синхронизацию:

val lock = Any()
var counter = 0

fun increment() {
    synchronized(lock) {
        counter++
    }
}

Или атомарные классы:

val counter = AtomicInteger(0)

fun increment() {
    counter.incrementAndGet()
}