当前位置:  开发笔记 > 编程语言 > 正文

如何应对竞争条件

如何解决《如何应对竞争条件》经验,为你挑选了1个好方法。

我对网络开发很陌生.从我所看到的种族条件我想到的节点或JS它们是不可能的,因为它是单线程的,但我看到的是......我猜错了.有了这个小例子,有人可以解释它是如何工作的.

如果有一个1000美元的银行账户,两个人在完全相同的时间向该账户收取费用.第一人收费600美元,第二人收费200美元.

第一笔费用为1000美元 - 600美元,余额为400美元.但是,由于第二次充电同时达到1000美元 - 200美元,余额为800美元.显然,现在的余额应该是200美元.

根据我的理解会导致竞争条件,不是吗?您如何设置它以避免此问题?我不需要确切的代码,也许有人向我解释这个,或伪代码.

提前致谢.

编辑:我将编辑它最初如何设置代码导致竞争条件.

就像下面的帖子说的那样.代码将被设置为当帐户被点击时,它将减去金额并给出新的余额.显然这会导致比赛状况.



1> jfriend00..:

如果没有看到使用的确切代码,则无法专门回答您的示例,因为有安全的方法来编写代码和不安全的编写方法.

node.js是单线程的,但只要请求发出异步调用,就会在执行异步请求时运行其他请求.因此,您可以同时在飞行中有多个请求.这是否会导致"竞争条件"完全取决于您编写代码的方式,在特定情况下,还取决于您如何访问数据库.

如果你编写这样的代码(伪代码):

 get total from database
 subtract from total
 write new total to database

并且,对数据库的调用是异步的(它们很可能是),然后你肯定会遇到竞争条件,因为在你获得总数和写入总数之间,其他请求可能试图访问相同的总值并尝试修改它,一个请求将不具有最新的总值,或者两个将踩对方的结果(一个覆盖另一个).

另一方面,如果您有一个可以对数据库中的总值进行原子修改的数据库,如下所示:

subtract x from total in database

然后,您将受到保护,免受特定的竞争条件.


因为node.js是单线程的,所以在node.js中编写安全代码并不像在多线程Web服务器中那样复杂.这是因为Javascript只有一条路径同时执行.因此,在进行某种异步I/O调用之前,其他任何请求都不会同时运行.这使得访问node.js应用程序中的共享变量比在真正的多线程Web服务器环境中更加简单,其中对共享变量的任何访问都必须受到互斥锁(或类似的东西)的保护.但是,只要您进行异步调用,就必须意识到在那个时间点,其他请求可以运行.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有