JavaScript 中需要互斥体吗?

2022-08-30 05:30:48

我看到了这个链接:在JavaScript中实现互斥。另一方面,我已经读到javascript中没有线程,但这到底是什么意思?

当事件发生时,它们可以在代码中的什么位置中断?

如果JS中没有线程,我是否需要在JS中使用互斥锁?

具体来说,我想知道使用由 和 调用的函数对全局可访问变量的影响。setTimeout()XmlHttpRequestonreadystatechange


答案 1

Javascript被定义为一种重入语言,这意味着没有线程向用户公开,实现中可能有线程。异步回调等函数需要等待脚本引擎进入休眠状态才能运行。setTimeout()

这意味着在处理下一个事件之前,必须完成事件中发生的所有事情。

话虽如此,如果您的代码执行某些操作,并且它期望值在异步事件触发和调用回调时之间不会更改,则可能需要互斥体。

例如,如果你有一个数据结构,你点击一个按钮,它发送一个XmlHttpRequest,它调用一个回调,以破坏性的方式改变数据结构,你有另一个按钮直接改变相同的数据结构,在触发事件和执行回调之间,用户可以在回调之前单击并更新数据结构,然后可能会丢失值。

虽然您可以创建这样的争用条件,但在代码中很容易防止这种情况,因为每个函数都是原子的。这将是大量的工作,并需要一些奇怪的编码模式来创建竞争条件。


答案 2

这个问题的答案有点过时了,尽管在给出时是正确的。如果查看不使用Webworker的客户端javascript应用程序,仍然是正确的。

关于web workers的文章:
在javascript中使用webworkerMozilla在webworker
上使用多线程

这清楚地表明,通过web工作者的javascript具有多线程功能。至于这个问题,javascript中是否需要互斥锁?我不确定这一点。但是这个堆栈溢出帖子似乎相关:
N个异步线程的互斥