假设我有以下代码来预加载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)之后的代码只能运行一次。

现在,是否有可能发生这种情况:
  • 第一个图像被加载,函数被调用,numLoaded++将计数器增加到一个
  • 第二个图像被加载,该函数被调用(在不同线程中),numLoaded++将计数器增加到两个
  • 第一个线程检查现在为true的numLoaded==2,因此代码被执行
  • 第二个线程也检查numLoaded==2仍然是正确的,因此应该运行一次的代码再次被执行 ←问题!

  • 这是一次机会(尽管很小),如何避免这种情况?在其他语言中,我将为此使用临界区或互斥体,或者使numLoaded易失,并使用n=(++numLoaded)或其他方式,但是我该如何在JS中进行此操作?

    最佳答案

    正常情况下为does not run concurrently。使用Node.js可以做到这一点,但是这很困难,对于典型情况,您不必担心。

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

    10-11 07:17