同时访问变量

时间:2018-09-19 17:41:23

标签: javascript multithreading

我需要从几个可能同时触发的回调(事件处理程序)中增加全局变量。我是否需要担心同时访问该变量?是否有类似C#的Interlocked.Increment类似物?

2 个答案:

答案 0 :(得分:2)

  

JavaScript中是否有Interlocked.Increment的类似物?

是的,但您的情况不需要它。¹

  

我的意思是我需要从几个可能同时触发的不同回调(事件处理程序)中增加全局值。

它们永远不会同时开火。浏览器上的JavaScript在每个全局环境中仅运行一个线程(规范称为realm),有时在多个全局环境中共享同一线程。即使处理程序的事件同时触发或所有处理程序都响应同一事件,对它们的调用也会在任务队列中排队(JS规范将其称为作业队列,HTML规范将其称为任务队列),并且队列一次处理一个任务/工作。

  

我是否需要担心同时访问该变量?

不在您的情况下,否。


¹只是为了细节:仅在与多个线程共享SharedArrayBuffer实例时(在浏览器上,这是通过Web worker进行的)才需要。它是Atomics.add,可在类型为数组的数组上运行,该数组可能由SharedArrayBuffer支持。

答案 1 :(得分:1)

默认情况下,任何客户端JavaScript代码都是同步的。事件被推送到事件队列中,并在单线程事件循环中进行处理。因此,您无需担心比赛条件。请参阅https://medium.com/@kvosswinkel/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-7aa9dd8f3bfb

唯一的例外是当您开始使用Web Worker时。例如,在这种情况下,您可以查看原子(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics)。