Ответ
Примитивы синхронизации (мьютексы, семафоры и т.д.) нужны даже на одноядерном процессоре, потому что поток может быть прерван в любой момент. Без синхронизации возможны race conditions, когда два потока одновременно изменяют общие данные.
Пример:
var counter = 0
val lock = Object()
fun increment() {
synchronized(lock) {
counter++ // Без синхронизации может потерять инкремент
}
}
Даже на одном ядре планировщик ОС может переключить контекст между потоками в середине операции counter++, что приведёт к некорректному результату.