Javascript определяется как реентерабельный язык, что означает отсутствие потоковой передачи, доступной пользователю, в реализации могут быть потоки. Такие функции, как setTimeout()
асинхронные обратные вызовы, должны дождаться, пока обработчик сценариев спит, прежде чем они смогут работать.
Это означает, что все, что происходит в событии, должно быть завершено до того, как будет обработано следующее событие.
При этом вам может понадобиться мьютекс, если ваш код делает что-то там, где он ожидает, что значение не изменится между моментом запуска асинхронного события и моментом вызова обратного вызова.
Например, если у вас есть структура данных, в которой вы нажимаете одну кнопку, и она отправляет XmlHttpRequest, который вызывает обратный вызов, деструктивным образом изменяет структуру данных, и у вас есть другая кнопка, которая напрямую изменяет ту же структуру данных, между тем, когда событие было сработал, и когда был выполнен обратный вызов, пользователь мог щелкнуть и обновить структуру данных перед обратным вызовом, что затем могло бы потерять значение.
Хотя вы можете создать такое состояние гонки, очень легко предотвратить это в своем коде, поскольку каждая функция будет атомарной. Для фактического создания состояния гонки потребовалось бы много работы и несколько странных шаблонов кодирования.