JavaScript:异步事件回调的线程安全? (我需要 'volatile' 还是什么?)

标签 javascript multithreading asynchronous callback volatile

假设我有以下代码来预加载 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.srcb.src 会导致两个图像都在后台加载,然后调用 OnImageLoaded()准备好了。

显然 if (numLoaded==2) 之后的代码应该只运行一次。

现在,是否有可能发生这种情况:

  1. 加载第一张图片,调用函数,numLoaded++ 将计数器增加到one
  2. 加载第二张图片,调用函数(在不同线程中),numLoaded++ 将计数器增加到two
  3. 第一个线程检查 numLoaded==2 现在为真,所以代码被执行,
  4. 第二个线程还检查了 numLoaded==2,这仍然是正确的,因此应该执行一次的代码再次 ← 问题!

这是一个机会吗(虽然很小),我该如何避免呢?在其他语言中,我会为此使用关键部分或互斥锁,或者使 numLoaded 易变并执行 n=(++numLoaded) 或其他操作,但我如何在 JS 中执行此操作?

最佳答案

Javascript does not run concurrently在正常情况下。使用 Node.js 有多种方法可以做到这一点,但这相当困难,在典型情况下您不必担心。

关于JavaScript:异步事件回调的线程安全? (我需要 'volatile' 还是什么?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574601/

相关文章:

javascript - 如何在 UIWebview IOS 5 中使用 CodeMirror2 代码选择文本

javascript - c.easing[this.options.specialEasing && this.options.specialEasing[this.prop] || a] 在使用 JQuery Easing 插件时不是一个函数

javascript - 循环功能,动画不停留必要的时间

java - 线程同步和单例问题

javascript - 异步循环

asynchronous - 使用 Vert.x 逐行读取文件(AsyncFile 和 RecordParser 帮助)

javascript - 复制右键单击灯箱操作,就像在 github.com 上一样

c++ - 为什么这个 tbb 程序无法编译?

java - 在 Java 中启动、停止和监听进程

java - Maven 找不到符号 : class Asynchronous