Javascript được định nghĩa là một ngôn ngữ reentrant có nghĩa là không có luồng nào được hiển thị cho người dùng, có thể có luồng trong quá trình triển khai. Các hàm như setTimeout()
và lệnh gọi lại không đồng bộ cần phải đợi công cụ tập lệnh ngủ trước khi chúng có thể chạy.
Điều đó có nghĩa là mọi thứ xảy ra trong một sự kiện phải được hoàn thành trước khi sự kiện tiếp theo được xử lý.
Điều đó đang được nói, bạn có thể cần một mutex nếu mã của bạn thực hiện điều gì đó mà nó mong đợi giá trị không thay đổi giữa thời điểm sự kiện không đồng bộ được kích hoạt và khi lệnh gọi lại được gọi.
Ví dụ: nếu bạn có cấu trúc dữ liệu trong đó bạn nhấp vào một nút và nó sẽ gửi một XmlHttpRequest gọi một lệnh gọi lại, thay đổi cấu trúc dữ liệu theo cách phá hoại và bạn có một nút khác thay đổi trực tiếp cấu trúc dữ liệu tương tự, giữa thời điểm sự kiện xảy ra. được kích hoạt và khi lệnh gọi lại được thực thi, người dùng có thể đã nhấp và cập nhật cấu trúc dữ liệu trước lệnh gọi lại mà sau đó có thể mất giá trị.
Mặc dù bạn có thể tạo một điều kiện chủng tộc như vậy, nhưng rất dễ dàng để ngăn chặn điều đó trong mã của bạn vì mỗi hàm sẽ là nguyên tử. Sẽ là rất nhiều công việc và thực hiện một số mẫu mã kỳ quặc để tạo ra điều kiện cuộc đua trên thực tế.