如何应对竞争条件

时间:2015-12-13 19:54:51

标签: javascript node.js race-condition single-threaded

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

如果有一个1000美元的银行帐户,并且两个人在完全相同的时间向帐户收取费用,同时点击服务器。第一人收费600美元,第二人收费200美元。

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

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

提前致谢。

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

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

1 个答案:

答案 0 :(得分:5)

如果没有看到使用的确切代码,您的示例将无法得到具体回答,因为有安全的方法来编写代码和编写它的不安全方法。

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服务器环境中访问共享变量更大,在这种环境中,对共享变量的任何访问都必须受到互斥锁(或类似的东西)的保护。但是,只要您进行异步调用,就必须意识到在那个时间点,其他请求可以运行。

相关问题