我看到过这个链接:在JavaScript中实现互斥.另一方面,我已经读过javascript中没有线程,但究竟是什么意思呢?
当事件发生时,代码可以在哪里中断?
如果JS中没有线程,我是否需要在JS中使用互斥锁?
具体来说,我想知道如何使用功能由所谓的影响setTimeout()
和XmlHttpRequest
的onreadystatechange
对全局访问的变量.
Javascript被定义为可重入语言,这意味着没有向用户公开线程,实现中可能存在线程.像setTimeout()
异步回调这样的函数需要等待脚本引擎在它们能够运行之前进入休眠状态.
这意味着事件中发生的所有事情必须在处理下一个事件之前完成.
话虽这么说,如果你的代码做了某些事情,你可能需要一个互斥体,它希望在异步事件被触发和调用回调之间不会改变一个值.
例如,如果您有一个数据结构,您单击一个按钮并发送一个调用回调的XmlHttpRequest,则以破坏性方式更改数据结构,并且您有另一个按钮直接更改相同的数据结构,在事件发生时触发并且当执行回调时,用户可以在回调之前单击并更新数据结构,然后可以丢失该值.
虽然你可以创建一个竞争条件,但是在你的代码中很容易阻止它,因为每个函数都是原子的.这将是一项很多工作,并采取一些奇怪的编码模式来实际创造竞争条件.
这个问题的答案虽然在给出时是正确的,但有点过时了.如果查看不使用webworkers的客户端javascript应用程序,仍然是正确的.
关于网络工作者的文章:
使用webworkers Mozilla在网络工作者的javascript中进行多线程
处理
这清楚地表明,通过网络工作者的javascript具有多线程功能.关于问题是关于javascript需要的互斥量?我不确定这一点.但是这个stackoverflow帖子似乎很相关:
N个异步线程的互斥
正如@william指出的那样,
你可能需要一个互斥锁,如果你的代码做了一些事情,它希望在异步事件被触发和调用回调之间不会改变一个值.
这可以进一步推广 - 如果您的代码在异步请求结算之前需要对资源进行独占控制,那么您可能需要一个互斥锁.
一个简单的例子是你有一个按钮,它触发ajax调用以在后端创建一个记录.您可能需要一些代码来保护您免受触发快乐用户点击,从而创建多个记录.有很多方法可以解决这个问题(例如,禁用按钮,启用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增长多线程时,可能会担心互斥体等......