【发布时间】:2015-04-25 15:50:06
【问题描述】:
我经常读到您不必担心 javascript 中的竞争条件,因为它是单线程的。但我相信这是因为Run-to-completion 事件循环的性质。如果 Javascrit 没有“Run-to-completion”功能,它仍然可能存在并发问题。
让我们考虑一下这段代码sn-p:
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、websockets 等的异步部分中可能存在竞争条件。
-
如果你好奇的话,已经为此提供了一个深思熟虑的答案:stackoverflow.com/questions/21463377/…
-
@Jivings @adeno 查看问题的答案stackoverflow.com/questions/21467325/…
-
@brianvaughn 答案指出“竞争条件只能发生在两个或多个线程之间”,我认为这在脚本语言的情况下是不正确的。这让我很困惑。
标签: javascript multithreading concurrency race-condition