Асинхронность vs многопоточность. Чем отличаются?
Суть
Это две независимые характеристики.
Асинхронность — о порядке исполнения. Функция не возвращает результат сразу, а отдаёт управление вызывающему коду с обещанием сообщить результат позже (колбэк, Publisher, await). Ничего не говорится о том, где и сколькими потоками этот результат считается. Асинхронный код прекрасно живёт на одном потоке: run loop главного потока по очереди обрабатывает тачи, таймеры и сетевые колбэки; JavaScript в браузере — тот же принцип.
Многопоточность — о физическом исполнении. У процесса несколько потоков, каждый со своим стеком, планируемых ядром независимо; на многоядерном CPU они выполняются по-настоящему параллельно. Потоки делят адресное пространство процесса, поэтому и возникают гонки данных.
Полезная пара терминов: concurrency — структура программы, позволяющая задачам перекрываться во времени; parallelism — одновременное исполнение на нескольких ядрах. Асинхронность даёт concurrency; многопоточность — способ получить parallelism.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep