gpt4 book ai didi

javascript - 单线程脚本语言中可以有竞争条件吗?

转载 作者:行者123 更新时间:2023-12-02 16:13:58 25 4
gpt4 key购买 nike

我经常读到您不必担心 JavaScript 中的竞争条件,因为它是单线程的。但我相信这是因为Run-to-completion事件循环的本质。如果 Javascrit 没有“Run-to-completion ”功能,它仍然可能存在并发问题。

让我们考虑一下这段代码:

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);

假设 javascript“Run-to-completion”中没有这样的功能,并且任何事件都可以被抢占以运行另一个事件/代码。

现在假设第 7 行被执行,突然事件被抢占以处理第 3 行的事件。执行第 3 行和第 4 行后,前一个事件从第 8 行恢复。现在,当第 8 行执行时,新的事件被抢占。附加值pending将会丢失,因为它既没有被processValues处理功能不在 pending 中数组。

即使是单线程,也会发生竞争条件。那么,说 JavaScript 没有竞争条件是因为它是单线程的,这是不对的吗?具体来说,是因为Run-to-completion JavaScript 的特点?

编辑

显然,JavaScript 中可能存在竞争条件。我指的是由于 javascript 的单线程(或 Run-to-completion ?)性质而不会发生的某些竞争条件。例如我上面描述的那个。

最佳答案

是的,我们在单线程 JavaScript 中存在竞争条件。只是不像多线程代码中那么多(前提是您不使用 alertconfirm,更多内容见下文)。

您首先说“假设没有运行到完成功能”,然后描述了依赖于此的竞争条件。但这种竞争条件不会发生,因为正如您所说,JavaScript 具有运行到完成的机制。

虽然在 JavaScript 中确实有一类竞争条件我们不必担心,但仍有很多我们需要担心的情​​况。例如,异步代码总是有可能出现竞争条件。 (这就是 ajax 调用、来自网络 worker 的消息等)

以下是您常见的错误示例,这是现实世界的竞争条件:

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"; 时,如果该图像在缓存中,则完全有权利在该上触发 load 事件。 code>img:该事件将查找任何处理程序,但找不到任何处理程序,因此在当前代码完成后不会将任何回调排队运行 - 并且我们不会看到“已加载”消息。

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

这只是一个例子。但确实,我们免受其他人的侵害。例如,如果我们更改上面的代码:

var img = document.createElement('img');
img.onload = function() {
console.log("It loaded");
};
img.src = "kittens.png";
document.body.appendChild(img);
doSomethingElse();

...我们知道 doSomethingElse 将在 "It returned" 运行之前被调用,除非在某些浏览器上出现一些令人不快的边缘情况(我'm Looking At You, Mozilla) 围绕 alertconfirm 功能; bobince covers those in this other answer 。 (TL;DR - 至少某些版本的 Firefox 会在等待用户消除警报时触发 ajax 完成回调。)

关于javascript - 单线程脚本语言中可以有竞争条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867356/

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