Зачем нужны примитивы синхронизации в одноядерной архитектуре при многопоточности

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

Ответ

Примитивы синхронизации (мьютексы, семафоры и т.д.) нужны даже на одноядерном процессоре, потому что поток может быть прерван в любой момент. Без синхронизации возможны race conditions, когда два потока одновременно изменяют общие данные.

Пример:

var counter = 0
val lock = Object()

fun increment() {
    synchronized(lock) {
        counter++ // Без синхронизации может потерять инкремент
    }
}

Даже на одном ядре планировщик ОС может переключить контекст между потоками в середине операции counter++, что приведёт к некорректному результату.