在 JavaScript 的非阻塞事件循环中,读取然后更改变量是否安全?如果两个进程几乎同时改变一个变量会发生什么?
示例 A:
流程一:获取变量A(为100)
过程2:获取变量A(为100)
过程1:加1(就是101)
过程2:加1(是101)
结果:变量 A 是 101 而不是 102
这是一个简化的示例,具有 Express 路线。假设该路线每秒调用 1000 次:
let counter = 0;
const getCounter = () => {
return counter;
};
const setCounter = (newValue) => {
counter = newValue;
};
app.get('/counter', (req, res) => {
const currentValue = getCounter();
const newValue = currentValue + 1;
setCounter(newValue);
});
示例 B:
如果我们做一些更复杂的事情,比如Array.findIndex()
thenArray.splice()
呢?是不是因为另一个事件进程已经改变了数组,所以找到的索引已经过时了?
进程 A findIndex(为 12000)
进程 B findIndex(它是 34000)
工艺A拼接索引12000
工艺B拼接索引34000
结果:进程 B 删除了错误的索引,应该删除 33999
const veryLargeArray = [
// ...
];
app.get('/remove', (req, res) => {
const id = req.query.id;
const i = veryLargeArray.findIndex(val => val.id === id);
veryLargeArray.splice(i, 1);
});
示例 C:
如果我们在示例 B 中添加一个异步操作会怎样?
const veryLargeArray = [
// ...
];
app.get('/remove', (req, res) => {
const id = req.query.id;
const i = veryLargeArray.findIndex(val => val.id === id);
someAsyncFunction().then(() => {
veryLargeArray.splice(i, 1);
});
});
这个问题很难找到合适的词来描述它。请随时更新标题。
ABOUTYOU
相关分类