JavaScript:线程安全与异步事件回调?(我需要'挥发物'还是什么?)
JavaScript: thread safety with asynchronous event callbacks? (do I need 'volatile' or something?)
假设我有以下代码来预加载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++
将计数器增加到一个, - 第二个图像被加载,函数被调用(在不同的线程中),
numLoaded++
将计数器增加到两个, - 第一个线程检查
numLoaded==2
,现在是true,所以代码被执行, - 第二个线程也检查
numLoaded==2
,这仍然是真的,所以应该运行一次的代码被执行再次←问题!
这是一个机会(尽管非常小),我如何避免这种情况?在其他语言中,我会为此使用临界区,或互斥锁,或使numLoaded易失性并执行n=(++numLoaded)
或其他东西,但我如何在JS中进行此操作?
Javascript在正常情况下不能并发运行。有一些方法可以使用Node.js来实现,但这相当困难,在典型情况下你不必担心。
相关文章:
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 这个jquery代码在php中的等效物是什么
- 将构造函数赋值给某物是什么意思?
- Date的类似物是什么?. net中的UTC
- 链接、控制器和编译函数中的各种注入物是什么
- 这段代码的 php 等效物是什么
- 在OSX swift中,webviewdidfinishload的等效物是什么?