gpt4 book ai didi

javascript - 这个 JavaScript 示例是否创建 “race conditions” ? (只要它们可以存在于 JavaScript 中)

转载 作者:行者123 更新时间:2023-12-05 00:24:41 24 4
gpt4 key购买 nike

我知道 JavaScript 是单线程的,从技术上讲不能有竞争条件,但由于异步和事件循环,可能会有一些不确定性。这是一个过于简单的例子:

class TestClass {
// ...

async a(returnsValue) {
this.value = await returnsValue()
}
b() {
this.value.mutatingMethod()
return this.value
}
async c(val) {
await this.a(val)
// do more stuff
await otherFunction(this.b())
}
}
假设 b()依赖 this.value自从调用 a() 后没有改变, 和 c(val)正在从程序中的多个不同位置快速连续多次调用。这会造成数据竞争吗 this.value调用 a() 之间的变化和 b() ?
作为引用,我已经用 mutex 抢先解决了我的问题。 ,但我一直在质疑一开始是否有问题。

最佳答案

是的,竞争条件也可以并且确实发生在 JS 中。仅仅因为它是单线程的,并不意味着竞争条件不会发生(尽管它们很少见)。 JavaScript 确实是单线程的,但它也是异步的:指令的逻辑序列通常被分成在不同时间执行的更小的 block 。这使得交错成为可能,因此出现竞争条件。

对于简单的示例,请考虑...

var x = 1;

async function foo() {
var y = x;
await delay(100); // whatever async here
x = y+1;
}
...这是适应 JavaScript 异步世界的非原子增量的经典示例。
现在比较以下“并行”执行:
await Promise.all([foo(), foo(), foo()]);
console.log(x); // prints 2
...与“顺序”之一:
await foo();
await foo();
await foo();
console.log(x); // prints 4
请注意,结果不同,即 foo()不是“异步安全的”。

即使在 JS 中,您有时也必须使用“异步互斥锁”。您的示例可能是其中一种情况,具体取决于两者之间发生的情况(例如,如果发生一些异步调用)。在 do more stuff 中没有异步调用看起来突变发生在单个代码块中(以异步调用为界,但内部没有异步调用允许交错),我认为应该没问题。请注意,在您的示例中, a 中的分配在等待之后,而 b在最后的 await 之前调用。

关于javascript - 这个 JavaScript 示例是否创建 “race conditions” ? (只要它们可以存在于 JavaScript 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73202786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com