如何避免共享状态?

How to avoid shared state?

我读过很多次我应该避免共享状态以避免异步编程或多线程中的竞争条件。

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

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

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

共享状态/竞争条件更关心您不想丢失的信息。

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

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