2017-04-12 386 views
0

我已经阅读了很多次,我应该避免共享状态以避免异步编程或多线程竞争条件。如何避免共享状态?

因此,举例来说,如果我有一个程序,它从外部服务器保持获取数据和更新的对象在内存和用户的请求,请发送对象从内存。

我将如何改变这样的程序不使用共享状态的行为?

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

回答

1

共享状态/竞态条件是更多的什么信息,你不想失去的关注。

使用您的例子,它可能是合理的用户更新自己的登录设置,并为您从内存发送的用户对象的一个​​更新版本的数据库。这是合理的,因为用户无法同时从两台计算机更新自己的登录设置。

在另一方面,如果你有一个计数器来计算网站的访问总人数的对象,这将是不可取的发送内存对象被写入到数据库。这将是“共享状态”,因此许多用户需要同时写入该变量,这肯定会过期。例如,我可能是该网站的第五个访问者,但由于我的互联网速度很慢,您在访问网站的同时将5写入数据库。当我开始查看页面时,我只查询数据库,因此在计数器中有一个4的对象,因此我在后面写入5到数据库,这有效地使您访问该网站失效。相反,你会想要在服务器端进行现场访问,并且只需添加+1就可以获得(并且将其包含在线程安全的同步代码中)。

+0

但是,如果我想更新使用现有的信息从该对象的对象,我会得到该对象的最新副本,或锁定该对象的任何变化,对不对? – sidoshi

+0

不一定。如果它像用户的元数据一样,你可能不在乎你是否覆盖整个事物。 – Julie