2011-10-23 32 views
13

我還是Javascript的新手。我正在開發一個簡單的頁面,我點擊一個按鈕獲取一個servlet的值並顯示它。它運作良好,除非我點擊按鈕上的瘋狂。有時,顯示的結果爲空。調用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網頁工作人員(這些工作人員控制得非常嚴格)以外,Javascript是單線程的,所以不存在線程安全問題。執行的一個線程將在下一個線程啓動之前完成。

類似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基本上是單線程的。 (有一些較新的瀏覽器功能提供了一種線程模型,但線程交互非常有限,數據不能直接共享。)

相關問題