Я часто читал, что вам не нужно беспокоиться о состоянии гонки в javascript, поскольку это однопоточный. Но я считаю, что это из-за характера циклов событий. Javascrit все еще может иметь проблемы с параллелизмом, если у него не было функции «Run-to-completion».Можем ли мы иметь условия гонки в однопоточных сценариях?
Давайте рассмотрим этот фрагмент кода:
1 var pending = [];
2 document.getElementById("submitBtn").addEventListener(function() {
3 var val = document.getElementById("textBox").value;
4 pending.push(val);
5 });
6 setInterval(function() {
7 processValues(pending);
8 pending = [];
9 }, 3000);
, что предполагаю, не было такой функции в JavaScript «Run-to-completion» и любое событие может быть предварительно опорожнить, чтобы запустить другое событие/код.
Теперь предположим, что строка 7 запускается, и внезапно событие получает предупреждение для обработки события в строке 3. После выполнения строки 3 & 4 предыдущее событие возобновляется из строки 8. Теперь, когда строка 8 выполняется, новая добавленная стоимость в pending
будет потеряна, потому что она не обрабатывается функцией processValues
, но не находится в массиве pending
.
Состояние гонки произошло, хотя оно однопоточное. Итак, неправильно говорить, что javascript не имеет условий гонки, потому что он однопоточный? В частности, это из-за функции Run-to-completion javascript?
EDIT
По-видимому, могут быть условия гонки в JavaScript. То, что я имел в виду, это определенный класс условий гонки, который не возникает из-за однопоточного (или из-за Run-to-completion?) Характера javascript. Например, тот, который я описал выше.
Где вы это читали? Условия гонки являются общими для асинхронного кода. – Jivings
Условия гонки возможны в асинхронных частях javascript, websockets и т. Д. – adeneo
Задумчивый ответ уже предоставлен для этого, если вам интересно: http://stackoverflow.com/questions/21463377/can-we-have- race-conditions-in-a-one-thread-program – brianvaughn