假设我有以下代码来预加载 2 个图像,并且仅在加载完两个图像后才执行某些操作:
var numLoaded = 0;
function OnImageLoaded()
{
numLoaded++;
if (numLoaded==2) alert("Got 'em!");
}
var a = new Image();
var b = new Image();
a.onload = OnImageLoaded;
b.onload = OnImageLoaded;
a.src = 'foo.jpg';
b.src = 'bar.jpg';
分配 a.src
和 b.src
会导致两个图像都在后台加载,然后调用 OnImageLoaded()
准备好了。
显然 if (numLoaded==2)
之后的代码应该只运行一次。
现在,是否有可能发生这种情况:
- 加载第一张图片,调用函数,
numLoaded++
将计数器增加到one, - 加载第二张图片,调用函数(在不同线程中),
numLoaded++
将计数器增加到two, - 第一个线程检查
numLoaded==2
现在为真,所以代码被执行, - 第二个线程还检查了
numLoaded==2
,这仍然是正确的,因此应该执行一次的代码再次 ← 问题!
这是一个机会吗(虽然很小),我该如何避免呢?在其他语言中,我会为此使用关键部分或互斥锁,或者使 numLoaded 易变并执行 n=(++numLoaded)
或其他操作,但我如何在 JS 中执行此操作?
最佳答案
Javascript does not run concurrently在正常情况下。使用 Node.js 有多种方法可以做到这一点,但这相当困难,在典型情况下您不必担心。
关于JavaScript:异步事件回调的线程安全? (我需要 'volatile' 还是什么?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574601/