提问者:小点点

增量是JavaScript中的原子操作吗?


增量在JavaScript中是原子操作吗?如果一个线程正在访问i;,同时另一个线程开始访问该操作会有什么问题吗?


共3个答案

匿名用户

在JavaScript中,函数总是运行到完成。这意味着如果一个函数正在运行,那么它将完全运行;只有在那之后,另一个函数才会被调用。因此,语句之间没有交错的机会(但在Java情况下是不同的)。

如果你对异步执行感到困惑,那么永远记住异步意味着稍后不是并行。所以,说到你的问题,答案是,不,你不会遇到任何问题,它将是一个完全的原子操作。

匿名用户

JavaScript是单线程的,所以你需要担心解锁或脏读问题。为什么JavaScript不支持多线程?

匿名用户

如果一个线程正在访问i;同时另一个开始访问操作会有问题吗?

注意:这一切都适用于符合规范的标准JavaScript引擎,例如Web浏览器和Node. js中的引擎。非标准JavaScript环境,例如Java虚拟机中内置的JavaScript脚本支持,可能(当然)定义替代的非标准语义学。

Reasync函数:async函数不涉及多线程。但是函数的逻辑挂起在await的事实可能会导致一些令人惊讶的行为。也就是说,它可能发生的地方被await明确标记。

除非你有必要,否则我不会担心下面的细节。但是对于那些这样做的人…

考虑:

let a = 1;

async function one() {
    return 1;
}

async function example() {
    console.log(`Adding 1 to a`);
    a += await one();
}

console.log(`Start, a = ${a}`);
Promise.all([
    example(),
    example(),
    example(),
])
.then(() => {
    console.log(`All done, a = ${a}`);
});