Почему в однопроцессорных системах необходимы механизмы синхронизации при работе с многопоточными приложениями?
Ответ от нейросети
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-операциях и других примитивах координации.