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