首页 > 解决方案 > JavaScript 中是否存在竞争条件?

问题描述

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

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

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

标签: javascripttypescriptasynchronous

解决方案


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函数总是启动和完成,而异步代码不会在执行的中途“中断”它。


推荐阅读