如何避免共享状态?

时间:2017-04-12 18:37:26

标签: node.js race-condition

我已经多次读过,我应该避免使用共享状态来避免异步编程或多线程中的竞争条件。

因此,例如,如果我有一个程序不断从外部服务器获取数据并更新内存中的对象,并根据用户请求,我会从内存中发送该对象。

如何将此类程序的行为更改为不使用共享状态?

我无法想出任何有意义的方式。我是否误解了不使用共享状态的想法?

1 个答案:

答案 0 :(得分:1)

对于您不想丢失的信息,共享状态/竞争条件更为重要。

使用您的示例,用户更新自己的登录设置以及将内存中的用户对象的更新版本发送到数据库可能是合理的。这是合理的,因为用户无法同时从两台计算机更新自己的登录设置。

另一方面,如果您有一个带有计数器的对象来计算您网站的总访问次数,则不建议将该内存中对象发送到数据库。这将是“共享状态”,因此许多用户需要同时写入该变量,这肯定会过时。例如,我可能是该网站的第5位访问者,但由于我的网速较慢,您在此期间访问该网站并将5写入数据库。我在开始查看页面时只询问了数据库,因此在计数器中有一个4的对象,所以我在你之后写了5数据库,这实际上使你对网站的访问无效。相反,您可能希望在服务器端计算站点访问次数,并且只需为您收到的内容添加+1(并将其包装在线程安全的同步代码中)。