如何在node.js中编写线程安全代码

这是我的app.js的一部分:

var connections = []; function removeConnection(res) { var i = connections.indexOf(res); if (i !== -1) { connections.splice(i, 1); } } 

当请求closures时,我调用removeConnection:

 req.on('close', function () { console.log("connection closed"); removeConnection(res); }); 

我不知道上面的代码是否是线程安全的? 我的意思是Node.js是事件驱动的,下面的情况可能吗?

  1. 连接是[a,b,c]
  2. threadB调用removeConnection
  3. 在threadB.removeConnection中:i = 1
  4. threadA调用removeConnection
  5. 在threadA.removeConnection中:i = 0
  6. 在threadA.removeConnection中:connections.splice(0,1); =>连接是[b,c]
  7. 在threadA.removeConnection:connections.splice(1,1); =>连接是[b]

正如你在这种情况下看到的,threadC的连接将被删除,而不是threadB的。

这可以发生吗? 如果是,那么我应该如何修复代码?

Node.js的关键原理之一是所有的用户代码都运行在一个单独的线程中,这样就不需要开发人员来处理编写线程安全代码的复杂性。

所以你的代码(和所有的Node.js代码)在定义上是线程安全的。