Что происходит если несколько потоков пытаются работать с одним объектом

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

Ответ

При одновременном доступе нескольких потоков к одному объекту без синхронизации могут возникнуть проблемы:

  1. Race condition - результат зависит от порядка выполнения потоков
  2. Несогласованность данных - частичное обновление состояния объекта

Пример проблемы:

var counter = 0

fun increment() {
    counter++ // Не атомарная операция!
}

// В нескольких потоках:
repeat(1000) { 
    thread { increment() } 
}
// Результат может быть меньше 1000

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

val lock = Any()

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

Альтернативы: AtomicInteger, Mutex, @Volatile (для примитивов), потокобезопасные коллекции.