Являются ли вызовы методов Javascript потокобезопасными или синхронизированными?

Я все еще новичок в Javascript. Я разрабатываю простую страницу, где я нажимаю кнопку, получая значение на сервлете и отображаю его. Он работает хорошо, если я не нахожусь на сумасшедшей кнопке. Иногда отображаемый результат равен нулю.

Мне интересно, вызвано ли это одновременными вызовами одной и той же следующей функции:

function loadXMLDoc2(retr) {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            $("#" + retr).button('option', 'label', xmlhttp.responseText);
            // document.getElementById(retr).innerHTML=xmlhttp.responseText;
        }
    }
    var param = "cmd=" + encodeURIComponent(retr);
    document.getElementById("TOP_LEFT").innerHTML = param;
    xmlhttp.open("GET","/WebFront/Asynclet?" + param,true);
    xmlhttp.send(null);
}

Является ли Javascript потокобезопасным? А если нет, то как я могу синхронизировать или изолировать вызовы к этому методу?

Ответ 1

Помимо веб-рабочих HTML5 (которые очень жестко контролируются), Javascript является однопоточным, поэтому нет проблем с безопасностью потоков. Один поток выполнения завершится до следующего запуска.

Такие вещи, как ответы ajax, проходят очередь событий и выполняются только в том случае, когда завершен какой-либо другой поток выполнения.

Смотрите Нужно ли беспокоиться о состоянии гонки с асинхронным Javascript? для получения дополнительной информации.

Для конкретного обсуждения обратных вызовов ответа ajax см. Как JavaScript обрабатывает ответы AJAX в фоновом режиме?.

Ответ 2

В контексте браузера JavaScript, по сути, является однопоточным. (Есть несколько новых функций браузера, которые предоставляют своего рода модель потоков, но взаимодействие потоков очень ограничено, и данные не могут быть напрямую разделены.)