Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
浏览器中的JavaScript是否可能存在并发读/写读/写冲突?_Javascript_Angularjs_Multithreading_Concurrency_Concurrent Programming - Fatal编程技术网

浏览器中的JavaScript是否可能存在并发读/写读/写冲突?

浏览器中的JavaScript是否可能存在并发读/写读/写冲突?,javascript,angularjs,multithreading,concurrency,concurrent-programming,Javascript,Angularjs,Multithreading,Concurrency,Concurrent Programming,我有一种情况,我正在进行几个(比如四个)ajax调用(如果有必要的话,使用AngularJS http get),我希望每次调用回调并增加一个计数器,这样我就可以知道所有(四个)线程何时完成 我担心的是,由于JavaScript没有任何可与Java的“synchronized”或“volatile”关键字相媲美的内容,因此在递增计数器时,多个并发线程可能会发生冲突,从而丢失一些递增内容 换句话说,两个线程同时出现,并且都读取计数器,得到相同的值(例如100)。然后两个线程都增加计数器(到101)

我有一种情况,我正在进行几个(比如四个)ajax调用(如果有必要的话,使用AngularJS http get),我希望每次调用回调并增加一个计数器,这样我就可以知道所有(四个)线程何时完成

我担心的是,由于JavaScript没有任何可与Java的“synchronized”或“volatile”关键字相媲美的内容,因此在递增计数器时,多个并发线程可能会发生冲突,从而丢失一些递增内容

换句话说,两个线程同时出现,并且都读取计数器,得到相同的值(例如100)。然后两个线程都增加计数器(到101)并存储新的值,看,我们错过了一个计数(101而不是102)

我知道JavaScript应该是单线程的,但也有例外


浏览器中可能出现这种情况吗?如果是的话,有什么方法可以防止这种情况吗?

正如您所提到的,由于javascript是单线程的,我不认为会发生这种情况,js成为多线程的唯一方法是使用webworkers,但即使它们不共享相同的变量(我在这里假设它们克隆了您传递的属性js对象),因此应该存在读/写重叠的情况

编辑

再想一想,假设有一个函数
onCounterIncrement
,当计数器递增时,它将执行一系列操作,如果您在递增计数器后不立即调用它,而是使用
$watch
或某个超时fn来检查计数器中的更改,则很可能会错过更改。

否,这是不可能的(不会发生冲突)。每个AJAX调用响应都可以被视为JavaScript消息队列上的一条消息。JavaScript运行时在处理下一条消息之前处理队列上的每条消息直到完成。换句话说,它调用事件的回调并运行完整的回调函数(以及它调用的所有函数等)在移动到队列中的下一条消息之前完成。因此,不会并行处理两条消息(例如AJAX响应)

资料来源:


另外,我在JavaScript中工作了很多年,我可以保证这就是它的工作原理。

由于承诺,不需要计数器。看看
$q.all()
$http
返回一个承诺,你可以包装一系列承诺,并在它们全部完成后调用。这在我身上从未发生过,阿飞,但我正在等待答案!好问题!@mplungjanslow@mplungjab你的方法太慢了,为什么每次呼叫都要等到最后一次才呼叫呢o知道您的解决方案是否有必要,或者JavaScript是否为您处理它us@VictorGrazi这根本不是一种常见的方法,除非调用依赖于相互传递数据。我的理解是,单线程的方法也有例外。例如,如果多个ajax调用同时返回,或者像鼠标事件之类的事情,需要并发以确保liveness@VictorGrazi,“JavaScript可能是异步的,这是真的。但是没有WebWorkers的基本JavaScript永远不会是多线程的。请看MárÖrlygsson的回答”——我相信你,但是你能为你的断言提供一些解释或来源吗?