【问题标题】:Race Condition exist in JavaScript? [closed]JavaScript 中是否存在竞争条件? [关闭]
【发布时间】:2020-09-13 07:34:43
【问题描述】:

我不知道这个问题与 Stack Overflow 有关。但我不知道在哪里问。

自从我将 JavaScript 作为单线程语言学习以来,竞争条件是否适用于 JavaScript。

我看过一些关于 JavaScript 中的竞争条件的 YouTube 视频示例。但没有什么能澄清我。如果有人可以向我解释在单线程 JavaScript 世界中如何可能出现竞争条件?

【问题讨论】:

  • 这可能仅仅是因为 JS 调用是异步的。启动三个不同的操作,您无法保证它们的完成顺序。
  • 我们如何避免 Javascript 异步调用中的竞争条件?
  • @user6410893:通过设计一个包含异步操作的逻辑。任何语言都没有单一的“避免竞争条件”设置,逻辑只需要处理它。

标签: javascript typescript asynchronous


【解决方案1】:

JavaScript 确实是单线程语言但是支持异步代码。

这是什么意思?

这意味着永远不会有两个代码块同时运行。在像 Java 这样的多线程语言中,两个函数可以同时运行,每个函数都在自己的线程上。但是在 JavaScript 中,即使使用异步代码,所有需要运行的代码也会被放入一个“队列”中,只是代码最终进入“队列”的顺序取决于您的逻辑是否同步。

一个例子:

const work = (a) => {
  console.log('Starting work: ' + a);

  // Here we simulate some long operation
  for (let i = 0; i < 100000; i++) {
    document.querySelector('a[href]');
  }

  console.log('Finished work: ' + a);
};

work(1);
work(2);
work(3);
setTimeout(() => work(4), 2);
setTimeout(() => work(5), 1);
work(6);
work(7);

您将在输出中看到的是:

Starting work: 1
Finished work: 1
Starting work: 2
Finished work: 2
Starting work: 3
Finished work: 3
Starting work: 6
Finished work: 6
Starting work: 7
Finished work: 7
Starting work: 4 <- This one was async
Finished work: 4 <- This one was async
Starting work: 5 <- This one was async
Finished work: 5 <- This one was async

因此,即使有一些异步代码,work 函数也始终启动和结束,而异步代码不会在执行过程中“中断”它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2010-11-27
    • 2010-09-25
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多