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