javascript é definido como uma linguagem ressentida, o que significa que não há tópicos expostos ao usuário, pode haver subprocessos na implementação. As funções como setTimeout()
e os retornos de chamada assíncronos precisam esperar que o mecanismo de script seja suspenso antes de ser executado.
Isso significa que tudo o que acontece em um evento deve ser finalizado antes que o próximo evento seja processado.
Dito isto, você pode precisar de um mutex se o seu código faz algo onde você espera que um valor seja alterado entre o momento em que você acionou o evento assíncrono e o momento em que ele foi chamado de retorno de chamada.
Por exemplo, se você tiver uma estrutura de dados na qual você clica em um botão e enviar um xmlhttprequest que chama um retorno de chamada, ele altera a estrutura de dados de forma destrutiva e tem outro botão que altera a mesma estrutura de dados diretamente, entre Quando o evento foi baleado e quando o retorno de chamada foi executado, o usuário poderia ter clicado e atualizou a estrutura de dados antes do retorno de chamada, o que pode perder valor.
Enquanto você pode criar uma condição de carreira como essa, é muito fácil evitá-lo em seu código, já que cada função será atômica. Seria muito trabalho e alguns padrões de codificação estranhos seriam necessários para criar a condição de carreira de fato.