Может ли программа завершиться если не позаботиться о синхронизации нескольких потоков

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

Ответ

Да, программа может завершиться, но результат работы может быть некорректным из-за race conditions. Потоки могут перезаписывать данные друг друга или читать неактуальные значения. Например:

var counter = 0

fun main() {
    repeat(100) {
        thread {
            repeat(1000) { counter++ }
        }
    }
    Thread.sleep(1000)
    println(counter) // Может быть меньше 100000
}

Без синхронизации итоговое значение counter может отличаться от ожидаемого 100000 из-за одновременного доступа потоков к переменной. Для корректной работы нужно использовать AtomicInteger, synchronized или другие механизмы синхронизации.