Vic*_*azi 5 javascript concurrency multithreading concurrent-programming angularjs
我有一个情况,我正在进行几个(比如四个)ajax调用(使用AngularJS http get,如果这很重要)我希望每次调用回调并增加一个计数器,所以我可以知道所有(四个)线程何时有完成.
我担心的是,由于JavaScript没有任何可与Java的"synchronized"或"volatile"关键字相媲美的东西,因此多个并发线程可能会在递增计数器时发生冲突,从而错过了一些增量.
换句话说,两个线程同时出现,并且都读取计数器,获得相同的值(例如100).然后两个线程都递增该计数器(到101)并存储新值,不料,我们错过了一个计数(101而不是102)!
我知道JavaScript应该是单线程的,但也有例外.
这种情况是否可以在浏览器中使用,如果是这样,有没有办法防范它?
不,这是不可能的(不会发生碰撞)。每个 AJAX 调用响应都可以视为 JavaScript 消息队列中的一条消息。JavaScript 运行时处理队列中的每条消息直至完成,然后再处理下一条。换句话说,它调用事件的回调函数并运行完整的回调函数(以及它调用的所有函数,等等)直到完成,然后再移动到队列中的下一条消息。因此,不会并行处理两个消息(例如,AJAX 响应)。
来源:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop
此外,我已经在 JavaScript 中工作了很多年,可以保证这就是它的工作方式。
| 归档时间: |
|
| 查看次数: |
1932 次 |
| 最近记录: |