2009-08-04 62 views
2

小應用程序JavaScript調用以任何適當的方式序列化?我正在考慮實現一個模型,其中兩個線程發送javascript命令。一個響應來自瀏覽器(js)的請求,另一個週期性地瀏覽瀏覽器。我的問題是這樣的:如果這兩個JavaScript請求發生衝突會發生什麼?Applet JSObject JavaScript調用序列化嗎?

我很擔心併發的javascript請求,因爲直覺導致我相信其中一個調用將會以非確定的方式失敗。

回答

2

Javascript是單線程的。在任何給定的時間只能執行一個代碼塊;任何其他發生的事件,方法等都會等到當前正在執行的代碼終止。谷歌瀏覽器的JavaScript引擎可能是一個例外 - 我記得他們提到某種多線程JavaScript支持的功能,但我不確定它是如何工作的。在IE 6中,瀏覽器UI實際上在JS代碼運行時變得沒有響應(例如,如果你停在關鍵字「調試器」的斷點處,或者IE設置爲調試)。

1

序列化?你的意思是同步嗎? JSObject的工作原理是將基元傳遞給一個JSContext JNI NPAPI包裝器,該包裝器在底層瀏覽器實現中作用於DOM。你指的是通過JNI傳遞原始數據嗎?

我不太瞭解chrome的JS引擎是如何工作的,但我認爲由於chrome中的liveconnect NPAPI與其他人相同,所以編寫多線程javascript的能力與多線程JSObject訪問無關。受影響的代碼擴展了Firefox使用的相同抽象JSObject類。

JSObject/liveconnect有幾種實現 - 一些用於netscape/firefox,另一種用於ie(ocx)。就多線程而言,所有行爲都有所不同。

就liveconnect而言,DOM訪問通常不是線程安全的。所以,正式的,多線程訪問DOM是不確定的。如果您設法通過DOMService.run()中的代碼以外的其他方式實際訪問DOM,則會發生瘋狂的死鎖和競態條件。

所以,基本上,你需要你所有的java線程將所有的DOMActions發佈到你的DOM訪問調度線程中。