Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: concurrency, race condition, mutex, synchronization, thread safety

Что такое конкурентный доступ к данным?

Этот вопрос проверяет понимание проблем, возникающих при одновременном доступе нескольких потоков или процессов к общим данным, и необходимость синхронизации.

Короткий ответ

Конкурентный доступ — это ситуация, когда несколько потоков или процессов одновременно читают и записывают одни и те же данные. Это может привести к состоянию гонки (race condition), когда результат зависит от порядка выполнения потоков. Для предотвращения проблем используются механизмы синхронизации, такие как мьютексы, семафоры и блокировки.

Длинный ответ

Что такое конкурентный доступ?

Конкурентный доступ к данным возникает, когда несколько потоков выполнения (threads) или процессов одновременно обращаются к общему ресурсу, например, к переменной, файлу или записи в базе данных. Если хотя бы один из потоков изменяет данные, а другие читают или тоже изменяют их, может возникнуть состояние гонки (race condition). Это приводит к непредсказуемым результатам, трудно воспроизводимым ошибкам и падениям программы.

Пример проблемы

Рассмотрим простой счетчик, который увеличивается двумя потоками:

counter = 0

def increment():
    global counter
    temp = counter
    temp += 1
    counter = temp

# Поток 1 и Поток 2 выполняют increment() одновременно
# Возможный сценарий:
# Поток 1: temp = 0
# Поток 2: temp = 0
# Поток 1: temp = 1, counter = 1
# Поток 2: temp = 1, counter = 1
# Ожидалось counter = 2, но получили 1

Это классический пример состояния гонки. Операция чтения-изменения-записи не является атомарной, и без синхронизации потоки могут перезаписывать результаты друг друга.

Как решать?

Для защиты общих данных используются примитивы синхронизации:

  • Мьютекс (Mutex) — блокирует доступ к ресурсу для других потоков, пока один поток работает с ним.
  • Семафор — ограничивает количество потоков, которые могут одновременно получить доступ к ресурсу.
  • Атомарные операции — неделимые операции, которые выполняются за один шаг (например, атомарный инкремент).

Пример с мьютексом в Python:

import threading

counter = 0
lock = threading.Lock()

def safe_increment():
    global counter
    with lock:
        temp = counter
        temp += 1
        counter = temp

# Теперь потоки выполняются последовательно внутри блока with

Где применяется?

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

Вывод: Конкурентный доступ требует обязательной синхронизации для предотвращения состояния гонки. Используйте мьютексы, семафоры или атомарные операции в зависимости от языка и задачи. Это основа для построения корректных многопоточных систем.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#concurrency

#race condition

#mutex

#synchronization

#thread safety

Подпишись на Java Developer в телеграм