web-dev-qa-db-ja.com

Javascriptメソッドの呼び出しはスレッドセーフですか、それとも同期されていますか?

私はまだJavascriptを初めて使用します。サーブレットの値をフェッチするボタンをクリックして表示する単純なページを開発しています。ボタンを狂ったようにクリックしない限り、うまく機能します。表示される結果がnullになる場合があります。

これは、同じ次の関数への同時呼び出しが原因であるかどうか疑問に思っています。

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はスレッドセーフですか?そうでない場合、このメソッドへの呼び出しを同期または分離するにはどうすればよいですか?

18

HTML5 Webワーカー(非常に厳密に制御されている)を除いて、Javascriptはシングルスレッドであるため、スレッドセーフに問題はありません。実行の1つのスレッドは、次のスレッドが開始される前に終了します。

Ajax応答のようなものは、イベントキューを通過し、他の実行スレッドが終了したときにのみ実行されます。

詳細については、 非同期Javascriptの競合状態を考慮する必要がありますか? を参照してください。

Ajax応答コールバックの具体的な説明については、 JavaScriptはバックグラウンドでAJAX応答をどのように処理しますか? 」を参照してください。

38
jfriend00

ブラウザのコンテキストでは、JavaScriptは基本的にシングルスレッドです。 (一種のスレッドモデルを提供するいくつかの新しいブラウザー機能がありますが、スレッドの相互作用は非常に制限されており、データを直接共有することはできません。)

5
Pointy