2

我对网络开发很陌生。从我读到的关于竞争条件的内容中,我认为使用 node 或 JS 是不可能的,因为它是单线程的,但我认为那是..我猜错了。通过这个小例子,有人可以解释它是如何工作的。

如果有一个银行账户,里面有 1000 美元,并且两个人在同一秒同时访问服务器时从账户中扣款。第一个人收费 600 美元,第二个人收费 200 美元。

第一次收费为 1000 美元至 600 美元,余额为 400 美元。但是由于第二次收费是在同一时间发生的,所以它会产生 1000 美元到 200 美元的费用,而余额则为 800 美元。显然,余额现在应该是 200 美元。

据我了解,这会导致比赛条件,不是吗?你将如何设置它来避免这个问题?我不需要确切的代码,也许有人向我解释这个,或者伪代码。

提前致谢。

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

就像下面的帖子说的。将设置代码,以便当账户被击中时,它会减去金额并给出新的余额。显然这会导致竞争条件。

4

1 回答 1

7

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

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 服务器环境中更简单,在真正的多线程 Web 服务器环境中,对共享变量的任何访问都必须由互斥锁(或类似的东西)保护。但是,一旦您进行异步调用,您必须意识到在那个时间点,其他请求可以运行。

于 2015-12-13T19:59:52.387 回答