当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中是否需要互斥锁?

如何解决《JavaScript中是否需要互斥锁?》经验,为你挑选了4个好方法。

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

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

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

具体来说,我想知道如何使用功能由所谓的影响setTimeout()XmlHttpRequestonreadystatechange对全局访问的变量.



1> William..:

Javascript被定义为可重入语言,这意味着没有向用户公开线程,实现中可能存在线程.像setTimeout()异步回调这样的函数需要等待脚本引擎在它们能够运行之前进入休眠状态.

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

话虽这么说,如果你的代码做了某些事情,你可能需要一个互斥体,它希望在异步事件被触发和调用回调之间不会改变一个值.

例如,如果您有一个数据结构,您单击一个按钮并发送一个调用回调的XmlHttpRequest,则以破坏性方式更改数据结构,并且您有另一个按钮直接更改相同的数据结构,在事件发生时触发并且当执行回调时,用户可以在回调之前单击并更新数据结构,然后可以丢失该值.

虽然你可以创建一个竞争条件,但是在你的代码中很容易阻止它,因为每个函数都是原子的.这将是一项很多工作,并采取一些奇怪的编码模式来实际创造竞争条件.


语言,这意味着没有向用户公开线程,实现中可能存在线程.像
创建这种竞争条件并不难:例如,我在一个字段中有一个"onkeyup"事件,它触发对DB的ajax调用以获取一些值.快速键入数据很容易导致无序结果.

2> 小智..:

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

关于网络工作者的文章:
使用webworkers Mozilla在网络工作者的javascript中进行多线程
处理

这清楚地表明,通过网络工作者的javascript具有多线程功能.关于问题是关于javascript需要的互斥量?我不确定这一点.但是这个stackoverflow帖子似乎很相关:
N个异步线程的互斥


从过去爆炸,但当多个标签访问相同的本地存储时,我遇到了对互斥锁的需求

3> alzclarke..:

正如@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中的互斥,但据我所知,这是一个简单的互斥量,它很方便.


互斥体只是一种有助于"避免同时使用公共资源"的算法.尽管多线程需要互斥锁,但定义中没有任何内容表示互斥锁是针对您描述的情况而定的.
我几乎不把它称为互斥体,至少不是传统意义上的互斥体,因为你在任何时候都没有在一个块的上下文中运行两个线程.

4> Mike Stone..:

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

但是,您需要担心的一件事是您的JavaScript将如何处理多个ajax请求,而这些请求的返回顺序与发送它们的顺序不同.所以,你真正需要担心的是确保你的ajax调用处理的方式是,如果结果以不同于你发送的顺序返回,它们将不会踩到彼此的脚.

这也适用于超时......

当JavaScript增长多线程时,可能会担心互斥体等......

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有