提问者:小点点

异步调用如何在更新相同的状态存储变量时避免冲突?


我有一个名为sum=0的变量,然后我有一个循环,它执行异步函数2000次,每一次都将返回一个值。我需要将2000个调用返回的所有值求和到我的变量sum中。

我如何保证2000个调用中的2个不会同时访问变量sum而错误计算sum?

例如:

Current sum : 50
Call X fetches value of : 8
Call Y fetches value of : 10

这两个调用尝试通过sum=sum+returnedvalue将它们获得的值添加到值sum中,在该操作中,它们获取sum的当前值(因为两者都将是50),并且它们中的每一个都尝试同时添加它们自己的returnedvalue

所以现在调用X会尝试将sum的值设置为58,调用Y会尝试将其设置为60(并且只有一个会成功),而实际值应该是68。

这个案子怎么处理?


共1个答案

匿名用户

您可以保证sum只会由一个线程更新(从不同时更新两个线程),因为JavaScript保证只有一个线程可以访问变量所在的领域(松散地说:全局环境和其中的东西)(直接地,或间接地在全局环境中的函数环境中)。

对于Node.js,您可以在这里找到详细信息。对于浏览器,这里。

很长一段时间以来,JavaScript规范对此保持沉默,因此理论上这取决于实现,但是流行的实现(浏览器中的实现和Node.js中的实现)在一个领域中运行JavaScript代码时使用单线程,这样做极大地简化了一些事情(例如并发访问情况),因此规范中编写了这种通用的实践。(这被证明是后续添加共享内存的非常有用的先驱 ;共享内存是领域之间共享的内存,因此可能是线程之间共享的内存。)

相关问题