问题描述
我有一个名为sum=0
的变量,然后有一个循环执行异步函数2000次,每个循环将返回一个值。
我需要将2000次调用返回的所有值加到变量sum中。
如何保证2000个调用中有2个不会同时访问变量sum并错误地求和?
例如:
Current sum : 50
Call X fetches value of : 8
Call Y fetches value of : 10
这两个调用尝试将通过sum = sum + returnedValue
获得的值相加,在该操作中,它们获取sum
的当前值(两者均为50),并且每个尝试来同时添加自己的returnedValue
。
因此,现在呼叫X会尝试将sum
的值设置为 58 ,而呼叫Y会尝试将其值设置为 60 (而且只有一个它们将会成功),而实际值应为 68 。
如何处理此案?
解决方法
由于JavaScript保证只有一个线程可以访问realm(松散地:全局环境和变量存在于其中的东西(在全局环境中的函数环境中直接或间接存在)。
特别是对于Node.js,您可以找到详细信息here。对于浏览器,here。
很长一段时间以来,JavaScript规范对此都保持沉默,因此从理论上讲它取决于实现,但是流行的实现(浏览器和Node.js中的实现)在领域中运行JavaScript代码时使用单个线程。 ,并且这样做大大简化了某些事情(例如您的并发访问情况),因此规范中的codified是常见的普遍做法。 (这证明是随后添加shared memory的非常有用的先兆-领域之间共享内存,因此有可能在线程之间共享内存。)