JavaScript需要互斥吗?

时间:2020-03-06 14:38:11  来源:igfitidea点击:

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

当事件发生时,它们可以在代码中的何处中断?

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

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

解决方案

JavaScript是单线程的...尽管Chrome可能是一种新的野兽(我认为它也是单线程的,但是每个选项卡都有它自己的JavaScript线程...我没有对其进行详细研究,所以请不要引用我那里)。

但是,我们需要担心的一件事是JavaScript如何处理以不同发送顺序返回的多个ajax请求。因此,我们真正需要担心的是,如果结果返回的顺序与我们发送的顺序不同,请确保ajax调用的处理方式不会踩到对方。

这也超时了...

当JavaScript增长到多线程时,则可能会担心互斥体之类的问题。

Javascript被定义为可重入语言,这意味着没有线程暴露给用户,实现中可能会有线程。诸如setTimeout()和异步回调之类的功能需要等待脚本引擎休眠后才能运行。

这意味着事件中发生的所有事情都必须先完成,然后才能处理下一个事件。

话虽如此,如果代码执行了某些操作,希望在触发异步事件和调用回调之间不更改其值,则可能需要使用互斥锁。

例如,如果我们有一个数据结构,我们在其中单击一个按钮,然后发送一个XmlHttpRequest来调用回调,则该XmlHttpRequest以破坏性的方式更改数据结构,而在事件发生之间,我们还有另一个按钮直接更改相同的数据结构。触发后,执行回调时,用户可能在回调之前单击并更新了数据结构,这可能会丢失值。

尽管我们可以创建这样的竞争条件,但很容易在代码中避免这种情况,因为每个函数都是原子的。实际上,要创建竞争条件将需要大量工作,并且需要一些奇怪的编码模式。

事件已发出信号,但JavaScript执行仍然是单线程的。

我的理解是,当发出事件信号时,引擎将停止其正在执行的事件以运行事件处理程序。处理程序完成后,将继续执行脚本。如果事件处理程序更改了一些共享变量,则恢复的代码将看到这些更改显得"出乎意料"。

如果要"保护"共享数据,则简单的布尔标志就足够了。

JavaScript是该语言,可以根据需要使用多线程,但是javascript引擎的浏览器嵌入一次只能运行一次回调(onload,onfocus,<script>等...)。威廉(William)建议使用Mutex在注册和接收回调之间进行更改,因此,从字面上看,不要这样做,因为我们不希望阻塞介入的回调,因为用于解锁该回调的回调将被阻塞在当前回调之后! (哇,英语在谈论线程方面很烂。)在这种情况下,如果设置了标志,则可能要沿字面意义重新分配当前事件,无论是字面上还是使用setTimeout()之类的。

如果我们使用的是JS的不同嵌入,并且一次执行多个线程,则可能会更加麻烦,但是由于JS可以轻松使用回调并在属性访问中锁定对象的方式,显式锁定几乎没有必要。但是,如果为使用多线程的通用代码(例如游戏脚本)设计的嵌入也没有给出一些明确的锁定原语,我会感到惊讶。

抱歉,没有文字!