gpt4 book ai didi

Javascript 和并发问题?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:25 25 4
gpt4 key购买 nike

假设我有简单的代码:

var counter = 0;
var sharedResource = [];//some shared resource

function incrementAndModify(){
if(counter == 0) {
sharedResource.push(Math.random());//very sensitive data
counter++;
}
}

function init(){
incrementAndModify();
doAjaxGetWithCallback(function(){incrementAndModify();});
incrementAndModify();
}

所以问题是:incrementAndModify() 函数是否会以原子方式运行?我读过,JS 在单线程上运行,不会有任何并发​​问题。但问题仍然悬而未决(至少对我而言)。

代替:

doAjaxGetWithCallback(function(){incrementAndModify();});

我可以这样写:

doAjaxGetWithCallback(function(){
doSomeCrazyStuffThatDoesNotUseSharedResource();
incrementAndModify();
doSomeOtherCrazyStuffThatDoesNotUseSharedResource();
});

最佳答案

浏览器中的 JavaScript 是单线程的( s 除外),因此您不必为并发而烦恼。本质上 - 每个代码块都是原子的,无论多长时间。如果 incrementAndModify() 做了一些非常耗 CPU 的耗时操作,AJAX 响应到达时,回调不会被执行,直到当前 incrementAndModify() 完成并释放唯一线程。

这也是不鼓励同步 AJAX 调用的原因:AJAX 请求可能需要一些时间,在此期间无法执行其他代码(执行线程被不必要地占用)。这会导致 GUI“卡住”,因为没有处理其他用户事件。

另见

顺便说一句:

doAjaxGetWithCallback(function(){incrementAndModify();});

可以这样写:

doAjaxGetWithCallback(incrementAndModify);

关于Javascript 和并发问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com