2011-10-23 9 views
13

私はまだJavascriptを初めて使っています。私はボタンをクリックしてサーブレット上の値を取得して表示する簡単なページを開発しています。私がボタンに狂っているようにクリックしない限り、うまくいきます。場合によっては、表示される結果はnullです。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をスレッドセーフですか?そうでない場合は、このメソッドへの呼び出しをどのように同期させたり分離したりできますか?

+0

ほとんどのブラウザは競合状態を防ぎます。簡単な(そしてシングルスレッド)ように設計されているので、私はJavaScriptで同期ブロックなどを見ていませんでした。 –

答えて

31

HTML5 Webワーカー(厳重に管理されている)以外のJavascriptはシングルスレッドなので、スレッドの安全性に問題はありません。 1つの実行スレッドは、次のスレッドが開始される前に終了します。

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

詳細はDo I need to be concerned with race conditions with asynchronous Javascript?を参照してください。

ajax応答コールバックの具体的な説明は、How does JavaScript handle AJAX responses in the background?を参照してください。

4

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

関連する問題