JavaScript中是否需要互斥体?

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

当事件发生时,代码中哪里可以中断?

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

具体来说,我想知道使用setTimeout()XmlHttpRequestonreadystatechange全局访问variables的影响。

Javascript被定义为一个可重入的语言,这意味着没有线程暴露给用户,实现中可能有线程。 诸如setTimeout()和asynchronouscallback之类的函数需要等待脚本引擎在能够运行之前进入睡眠状态。

这意味着事件发生的一切都必须在下一个事件被处理之前完成。

话虽如此,如果你的代码做了一些事情,那么当asynchronous事件被触发和调用callback时,你可能需要一个互斥量。

例如,如果你有一个数据结构,你点击一个button,并发送一个调用callback的XmlHttpRequest,以一种破坏性的方式改变数据结构,并且你有另一个button直接改变相同的数据结构,并且当callback被执行时,用户可以在callback之前点击并更新数据结构,然后可以丢失该值。

虽然可以创build一个竞争条件,但是由于每个函数都是primefaces的,所以在代码中很容易避免。 事实上,这将是很多工作,并采取一些奇怪的编码模式来创造竞争条件。

这个问题的答案虽然在给予时是正确的,但有点过时了。 如果看一个不使用webworkers的客户端JavaScript应用程序,仍然是正确的。

networking工作者的文章:
使用webworkers在JavaScript中multithreading
Mozilla的networking工作者

这清楚地表明,通过networking工作者的JavaScript具有multithreadingfunction。 至于有关的问题是JavaScript中需要互斥体? 我不确定这一点。 但是这个stackoverflow后似乎相关:
互斥N个asynchronous线程

正如@威廉指出的那样,

你可能需要一个互斥量,如果你的代码做了一些事情,那么当asynchronous事件被触发和callback被调用时,它的值就不会改变。

这可以进一步推广 – 如果你的代码在asynchronous请求解决之前做了一些预期资源独占控制的事情,你可能需要一个互斥体。

一个简单的例子是你有一个button,触发ajax调用,在后端创build一个logging。 您可能需要一些代码来保护您免于触发快乐用户的点击,从而创build多个logging。 有很多方法来解决这个问题(例如,禁用button,启用Ajax成功)。 你也可以使用一个简单的锁:

 var save_lock = false; $('#save_button').click(function(){ if(!save_lock){ //lock save_lock=true; $.ajax({ success:function() //unlock save_lock = false; } }); } } 

我不确定这是否是最好的方法,我会有兴趣看看其他人如何处理JavaScript中的互斥,但据我所知,这是一个简单的互斥体,它是方便的。

JavaScript是单线程的…虽然Chrome可能是一个新的野兽(我认为它也是单线程的,但每个标签都有它自己的JavaScript线程…我没有详细的看过它,所以不要引用我那里)。

然而,你需要担心的一件事是你的JavaScript将如何处理多个Ajax请求以不同的顺序发回。 所以,你真正需要担心的是确保你的ajax调用的处理方式,如果结果以不同于你发送的顺序返回的话,他们将不会踩在彼此的脚上。

这也适用于超时…

当JavaScript增长multithreading,那么也许担心互斥体之类的….

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

我的理解是,当事件被发信号时,引擎停止正在执行的事件,以便运行事件处理程序。 处理程序完成后,脚本执行恢复。 如果事件处理程序改变了一些共享variables,那么恢复的代码将会看到这些“出乎意料”的变化。

如果你想“保护”共享数据,简单的布尔标志应该是足够的。

JavaScript, 语言可以像你想要的那样是multithreading的,但是JavaScript引擎的浏览器embedded一次只能运行一个callback函数(onload,onfocus,<script>等等)(假设每个标签)。 Williambuild议在注册和接收callback之间使用Mutex进行更改不应该太过于字面意义,因为您不希望在干预callback中阻止,因为解锁它的callback将在当前callback后被阻止! (哇,英文很讨厌线程)。在这种情况下,如果设置了一个标志,你可能希望按照重新分派当前事件的方式做一些事情,无论是从字面上还是使用setTimeout()。

如果你使用的是一个不同的JSembedded,并且一次执行多个线程,那么它会变得更加危险,但是由于JS可以很容易地使用callback并且在属性访问上locking对象,所以显式locking几乎没有必要。 不过,如果为使用multithreading的通用代码(例如游戏脚本)devise的embedded也不会给出一些明确的locking原语,我会感到惊讶。

对不起,墙上的文字!