javascript - 如果用户多次单击元素,如何避免竞争条件?

标签 javascript multithreading race-condition

如果用户多次单击该元素,如何避免竞争条件?据我所知,Javascript 是一种单线程语言。会发生任何竞争条件吗?

如果是这样,我能想到的最好的办法就是在关键部分之前有一个标志。但从一般的并发知识来看,如果2个线程一起进入第3行,仍然可能会发生竞争条件。

var isInProgress = false;
$('#target').click(function () {
  if (isInProgress) {
    console.log('In progress, skipping.');
    return;
  }
  isInProgress = true;

  // Critical section start
  ...
  // Critical section end
  isInProgress = false;
});

最佳答案

竞争条件可能发生,主要是当程序员忘记 AJAX 等异步函数时。这种情况在 jQuery 用户中更容易发生,但即使是 Vanilla JS 编码员也容易受到这个问题的影响(但我完全不会。不可能。我永远不会犯这样的错误。不。-shifty eyes-)

话虽这么说,在这种情况下似乎不存在任何竞争条件的可能性。为了进行演示,请使用每个选项卡都有一个进程的浏览器(即不是 Firefox!),因为这会使它崩溃。

<button onClick="for(var i=0; i<1000000000; i++) alert('Clicked!');">Button</button>

由于单线程的原因,点击事件发生时浏览器不会响应。

现在关闭浏览器选项卡。你不庆幸自己没有使用 Firefox 吗? :p

关于javascript - 如果用户多次单击元素,如何避免竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965526/

相关文章:

django - 使用 PostgreSQL 在 Django 中获取下一个工作项

go - 如何在 Visual Studio Code 中为 Golang 启用竞争检测器?

javascript - 根据嵌套键值对对象数组进行排序的最快方法

javascript - 更改标签 Chart.js 的背景颜色

javascript - JavaScript中有没有root关键字或者为什么Sublime会这样显示?

java - 为什么放置 start() 命令时会有所不同?

node.js - child_process spawn nodejs 中的竞争条件可能性

javascript - 语法错误 : Unexpected token angular-cli

java - 停止 JUnit 完成,直到所有其他线程都已停止

java - java中socket时出现巨大延迟