2012-03-15 3 views
4

Работает ли javascript на одном потоке? Если я объявляю глобальный массив и начинаю изменять его (например, удалять элементы) в обратном вызове AJAX и в то же время начинать изменять тот же массив в другой функции (вызываемой с помощью SetTimeOut) - существует ли риск состояния гонки?Является ли javascript однопоточным?

Я нашел эту тему: javascript race condition, кто-то сказал, что условия гонки никогда не бывают в javascript, потому что они всегда работают в одном потоке и одиночном стоп-кадре. Это зависит от того, как браузер реализует его или гарантированно ли он всегда однопоточным во всех браузерах?

+2

Там могут быть гонки условия из-за задержек в сети, если вы работаете с AJAX, но не из-за самого JavaScript, потому что это единый -threaded. – pimvdb

+0

Не совсем всегда: http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded – phazei

ответ

4

Гарантировано, что он всегда будет однопоточным во всех браузерах?

Да.

Конечно, такие вещи, как HTTP-запросы, могут работать в разных потоках за кулисами, но когда ваш код Javascript выполняется, это может произойти только из одного потока за раз.

+0

Почему гарантия однопоточности? – dldnh

+1

@dldnh http://en.wikipedia.org/wiki/Global_Interpreter_Lock –

2

JavaScript не имеет резьбы.

ссылаются, после обсуждает различия setTimeout на разных машинах ...


HTML5 вводит понятие WebWorkers, который выполняет JavaScript на многократный фоне нитей. Хотя это не поддерживается во всех браузерах ...

https://developer.mozilla.org/En/Using_web_workers

http://dev.w3.org/html5/workers/

+0

С веб-рабочими это больше похоже на выполнение двух отдельных однопоточных скриптов и отправку сообщений друг другу, чем один многопоточный скрипт. Переменная не может быть видимой в обоих потоках, рабочие не могут манипулировать DOM и т. Д. –