Sobes.tech
Назад к вопросам
Junior — Middle
59

Почему в однопроцессорных системах необходимы механизмы синхронизации при работе с многопоточными приложениями?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Даже на одном процессоре потоки могут выполняться не одновременно, а чередоваться в произвольные моменты времени. Из-за этого несколько потоков могут одновременно работать с одними и теми же данными и ломать их согласованность. Синхронизация нужна, чтобы защитить критические секции и обеспечить предсказуемость доступа к общим ресурсам.

Определение:

В однопроцессорной системе механизмы синхронизации нужны не для параллельного выполнения на разных ядрах, а для контроля переключений между потоками. Операционная система может остановить один поток в любой момент и переключиться на другой, поэтому без синхронизации возможны race condition, потеря обновлений и чтение промежуточного состояния данных. Синхронизация гарантирует, что только один поток в нужный момент изменяет общий ресурс или что потоки корректно координируют доступ к нему.

Пример использования:

Например, два потока одновременно увеличивают общий счетчик заказов в приложении. Если оба прочитают одно и то же значение 10 и по очереди запишут 11, одно увеличение потеряется.

class Counter {
    private var value = 0
    private val lock = Any()

    fun increment() {
        synchronized(lock) {
            value++
        }
    }

    fun get(): Int = value
}

Пояснение кода:

Код показывает защиту общей переменной value с помощью synchronized. Шаги такие: один поток входит в критическую секцию и получает монитор объекта lock; пока он внутри, другой поток не может одновременно выполнить increment(); после выхода блокировка освобождается, и следующий поток получает доступ. Это исключает ситуацию, когда два потока одновременно читают и перезаписывают одно и то же значение.

Ключевые моменты:

  • На одном процессоре потоки не исполняются одновременно, но могут быстро переключаться друг на друга.
  • Из-за переключений возможны гонки данных даже без настоящего параллелизма.
  • Синхронизация защищает критические секции и сохраняет целостность общих данных.
  • Без нее возможны потерянные обновления, неконсистентное состояние и трудноуловимые баги.
  • Наличие одного CPU не отменяет необходимости в mutex, synchronized, atomic-операциях и других примитивах координации.