【发布时间】:2014-02-23 09:29:25
【问题描述】:
假设我有如下代码:
var shared = 100;
function workWithIt(){
shared += 100;
}
setTimeout(workWithIt, 500);
setTimeout(workWithIt, 500);
理想情况下,这段代码应该给变量shared加上200,之后是300。
但是,正如我从 c 了解到的,如果 += 操作被拆分为多个命令,则可能会产生一些影响。
可以说,这是函数的执行顺序:
setTimeout() --> create Thread A
setTimeout() --> create Thread B
wait 500ms
**Thread A** | **Thread B**
--------------------------------+---------------------------------
var tmpA = shared; //100 |
| var tmpB = shared; //100
| tmpB = tmpB+100; //tmpB=200
| shared = tmpB;
tmpA = tmpA+100; //tmpA=200 |
shared = tmpA; |
在这种情况下,shared 现在的值是 200。
这可以在许多编程语言中发生,例如 c、c++、java、c#、... - 但它也可以在 Javascript 中发生吗?
或者更笼统地说:Javascript 如何处理其线程,何时在线程之间切换,是否有内置方法可用于处理竞争条件?
【问题讨论】:
-
JavaScript 是单线程的。
-
但是你可以有几个并行的执行行,浏览器在它们之间切换。即使发生在同一个线程中,结果也是一样的。
-
这不是“在它们之间切换”。定时器就像事件生成器,定时器函数在处理下一个事件(或定时器)之前运行完成。在您的示例中,一个功能或另一个将始终在另一个开始之前运行完成。
-
是的。
alert()函数本身是一个例外:在等待用户关闭警报时,浏览器允许运行一些事件处理程序(我不记得具体是哪些)。但是运行中的 JavaScript 代码不会被浏览器中断——这就是为什么计算密集型代码(或无限循环)会导致浏览器弹出一个对话框,询问用户是否要终止正在运行的代码。
标签: javascript multithreading synchronization thread-safety race-condition