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

var connections = [];

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

当请求关闭时,我调用removeConnection:
req.on('close', function () {
    console.log("connection closed");
    removeConnection(res);
});

我想知道上面的代码是否是线程安全的吗?我的意思是,由于Node.js是事件驱动的,因此以下情况可能吗?
  • 连接是[a,b,c]
  • threadB调用removeConnection
  • threadB.removeConnection中的
  • :i = 1
  • 线程A调用removeConnection
  • threadA.removeConnection中的
  • :i = 0
  • ThreadA.removeConnection中的
  • :connections.splice(0,1); =>连接是[b,c]
  • ThreadA.removeConnection中的
  • :connections.splice(1,1); =>连接是[b]

  • 如您在这种情况下所看到的,线程C的连接将被删除,而不是线程B的连接。

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

    最佳答案

    Node.js的主要原则之一是所有用户代码都在单个线程中运行,这使开发人员无需处理编写线程安全代码的复杂性。

    因此,根据定义,您的代码(以及所有Node.js代码)是线程安全的。

    10-04 22:33