0

如果用户多次单击元素,如何避免竞争条件?我知道 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;
});
4

3 回答 3

1

正如您所说,Javascript 是一种单线程语言,所以,只要您的代码是顺序的,就没有竞争条件。

于 2013-11-13T22:17:25.123 回答
1

竞争条件可能会发生,主要是当程序员忘记了 AJAX 等异步函数时。这往往发生在 jQuery 用户身上,但即使是 Vanilla JS 编码器也容易受到这个问题的影响(不过,完全不是我。不可能。我永远不会犯那个错误。不。-狡猾的眼睛-)

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

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

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

现在杀死浏览器选项卡。你不高兴你没有使用 Firefox 吗?:p

于 2013-11-13T22:18:00.577 回答
0

我通常为元素添加一个类名,然后在事件处理程序中检查它并将其删除。它使您不必用变量污染全局空间。

于 2013-11-13T22:18:07.803 回答