首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在单线程脚本语言中,我们能有竞争条件吗?

在单线程脚本语言中,我们能有竞争条件吗?
EN

Stack Overflow用户
提问于 2015-04-25 15:50:06
回答 1查看 400关注 0票数 0

我经常读到,您不必担心javascript中的争用条件,因为它是单线程的。但我相信这是因为事件循环的运行到完成性质。如果没有"运行到完成“特性,Javascrit仍然可能存在并发问题。

让我们考虑一下下面的代码片段:

代码语言:javascript
运行
复制
1  var pending = [];

2  document.getElementById("submitBtn").addEventListener(function() {
3      var val = document.getElementById("textBox").value;
4      pending.push(val);
5  });

6  setInterval(function() {
7     processValues(pending);
8     pending = [];
9  }, 3000);

Asume表示,javascript "运行到完成“中没有这样的特性,任何事件都可以被抢占,以运行另一个事件/代码。

现在假设第7行被执行,突然事件被抢占到第3行处理事件。在执行第3& 4行之后,前一个事件从第8行恢复。现在,当执行第8行时,pending中的新增加值将丢失,因为它既不是由processValues函数处理,也不是在pending数组中。

即使是单线程的竞争条件也发生了.所以,说javascript没有竞争条件是不对的,因为它是单线程的?具体来说,是因为javascript的运行到完成特性吗?

编辑

显然,javascript中可能存在竞争条件。我指的是由于单线程(或运行到完成?)而不会发生的特定类型的争用条件?javascript的性质。例如,我上面描述的那个。

EN

回答 1

Stack Overflow用户

发布于 2015-04-25 16:01:49

是的,我们在单线程JavaScript中有竞争条件.只是不像多线程代码中那样多(如果您不使用alertconfirm,请参阅下文)。

您首先说的是“假设没有运行到完成的特性”,然后描述了一个依赖于此的竞赛条件。但是,这种竞赛条件不可能发生,因为,正如你所说的,JavaScript已经运行到完成.

虽然在JavaScript中确实存在一些我们不需要担心的比赛条件,但我们仍然有很多需要担心的问题。例如,异步代码将始终具有竞争条件的潜力。(这就是ajax调用、web工作者的消息等等)

下面是你经常看到的一个错误的例子,这是一个真实的种族状况:

代码语言:javascript
运行
复制
var img = document.createElement('img');
img.src = "kittens.png";
img.onload = function() {
    console.log("It loaded");
};
document.body.appendChild(img);

这是安全的,对吧?错了。仅仅因为JavaScript是单线程运行,并不意味着浏览器是单线程的。当浏览器看到img.src = "kittens.png";时,如果图像在缓存中,那么在该img上触发load事件完全在其权限之内:该事件将查找任何处理程序,而不是找到任何处理程序,因此在当前代码完成后不会将任何回调排队运行--我们也看不到“它加载了”消息。

虽然这是一个基于浏览器的示例,但它是一个通用主体的例子:仅仅因为主机环境运行一个主JavaScript线程,并不意味着主机环境不是多线程的,多线程可能会对我们的单线程代码产生影响。

这只是一个例子。但事实是我们对其他人很安全。例如,如果我们更改上面的代码:

代码语言:javascript
运行
复制
var img = document.createElement('img');
img.onload = function() {
    console.log("It loaded");
};
img.src = "kittens.png";
document.body.appendChild(img);
doSomethingElse();

...we 知道在运行"It loaded"之前将调用 doSomethingElse,除非在某些浏览器(我正在查看您,Mozilla)中某些不愉快的边缘情况下使用alertconfirm函数;巴比斯在另一个答案中介绍了这些问题。。(TL;DR -至少有些版本的火狐会在等待用户拒绝alert时触发ajax完成回调。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29867356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档