全局变量赋值在NodeJS上是原子的吗?

时间:2018-11-03 05:23:48

标签: javascript websocket concurrency global-variables nodejs-server

我正在Node上的有状态websocket服务器上工作。我们需要一条对于biz逻辑很重要的只读数据,并将其保存在Node的全局范围内,最近,我们不得不使此需求缓存无效,并重新要求允许在运行时更改此数据。我的问题是,我们是否应该担心仅仅重新分配全局变量会导致重新请求的结果会导致并发连接之间出现问题,这些并发连接在不同阶段读取此数据的单个副本?谢谢!

1 个答案:

答案 0 :(得分:2)

  

NodeJS上的全局变量分配是原子的吗?

由于node.js仅将Javascript作为单线程运行,因此所有分配在Javascript中都是原子的。

  

我们应该担心只是重新分配全局变量会导致重新请求的结果会导致并发连接之间出现问题,这些并发连接在不同阶段读取此数据的单个副本吗?

您不必担心分配不是原子的。

  

如果一行代码读取此全局变量并将其值分配给另一个局部变量,然后再将其重新分配给全局变量,那么该局部变量的值在重新分配后是否会自动刷新?

先前有权访问数据的模块在分配后是否会看到新数据取决于代码的确切详细信息以及变量中的内容。要具体说明您的情况,您必须向我们显示实际代码以及该操作中分配的变量中的内容。

这是Javascript中分配的一般说明。赋值根据变量中的内容执行不同的操作。

原语在分配时被复制。通过共享对象的指针(不复制)来分配对象。因此,具有指向同一对象的指针的任何人都将看到该对象上的所有属性更改,因为它们指向完全相同的对象。但是,如果您将新对象分配给master变量,则所有其他对象仍将具有指向先前对象而不是新对象的指针。

以下是一些例子来说明:

let master = {name: "John"};

// x gets pointer to the same object that master points to
// both master and x point to the same object
let x = master;
console.log(x.name);    // "John"

// update property on master
// but, both variables point to the same object so both see
// the change in the property value on that object
master.name = "Alice";
console.log(master.name);  // "Alice"
console.log(x.name);       // "Alice"
console.log(x === master); // true, they both point to the same object

// reassign a new object to master variable
master = {name: "Drew"};

// x still points at original object that was originally in master
// and knows nothing about the whole new object in master now
console.log(master.name);  // "Drew" 
console.log(x.name);       // still "Alice", not "Drew"
console.log(x === master); // false, not the same object

原始数据类型(例如数字或布尔值)是通过复制分配的,因此在将一个变量的内容分配给另一个变量之后,两个变量之间根本没有连接。它们每个都有自己的数据内容,因此更改一个变量的值不会影响另一变量的内容。

 // primitive data value
 let master = 2;

 let x = master;
 console.log(x);     // 2

 master = 10;
 console.log(x);     // still 2
相关问题