Javascript se define como un lenguaje reentrante , lo que significa que no hay subprocesos expuestos al usuario, puede haber subprocesos en la implementación. Las funciones como setTimeout()
las devoluciones de llamada asincrónicas deben esperar a que el motor de secuencia de comandos se suspenda antes de poder ejecutarse.
Eso significa que todo lo que sucede en un evento debe terminarse antes de que se procese el próximo evento.
Dicho esto, es posible que necesite un mutex si su código hace algo en el que espera que un valor no cambie entre el momento en que se disparó el evento asíncrono y el momento en que se llamó a la devolución de llamada.
Por ejemplo, si tiene una estructura de datos en la que hace clic en un botón y envía una XmlHttpRequest que llama a una devolución de llamada, cambia la estructura de datos de una manera destructiva, y tiene otro botón que cambia la misma estructura de datos directamente, entre el momento en que se produjo el evento. se disparó y cuando se ejecutó la devolución de llamada, el usuario pudo haber hecho clic y actualizado la estructura de datos antes de la devolución de llamada, lo que podría perder el valor.
Si bien puede crear una condición de carrera como esa, es muy fácil evitarlo en su código, ya que cada función será atómica. Sería mucho trabajo y se necesitarían algunos patrones de codificación extraños para crear la condición de carrera de hecho.