2015-04-20 25 views
0

我讀的article有關私營/ protected成員「仿真」 與JavaScript(我知道這是不是一個最佳實踐但它是研究目的在javascript中使用閉包之間的變量是否是線程安全的?

例如,在這個代碼中,我們已經:

var Class = (function() { // Open closure 
 

 
var caller = null; 
 

 
//[...] 
 

 
var mayAccessWrapped = false; 
 
function wrapmethod(method) { 
 

 
    mayAccessWrapped = true; 
 
    if (method.__getWrappedMethod) { 
 
     method = method.__getWrappedMethod(); 
 
    } 
 
    mayAccessWrapped = false; 
 

 
    var wrapped = function wrapper() { 
 
     var prevCaller = caller; 
 
     caller = wrapper; 
 
     var returns; 
 
     try { 
 
      returns = method.apply(this, arguments); 
 
     } 
 
     finally { 
 
      caller = prevCaller; 
 
     } 
 
     return returns; 
 
    }; 
 
    wrapped.__getWrappedMethod = function() { 
 
     if (mayAccessWrapped) { return method; } 
 
     throw "Error: only the wrapping function may access the wrapped method"; 
 
    } 
 
    return wrapped; 
 
} 
 
    
 
//[...] 
 

 
return Class; 
 

 
})(); // End Class closure

「包裝」 方法是從同一個對象多次使用和它使用調用者變量通過「調用」方法「注入」有關「調用者」的信息(alternative to deprecated arguments.callee)。

但是,在一個併發的範圍內,這種方式線程安全嗎?是否有可能另一種方法可以改變調用者的值變量使數據一致性失效?

+0

Javascript沒有線程。 – SLaks

+0

不完全正確,它依賴於引擎:http://jxcore.com/home/ – Joseph

+1

從鏈接到的引擎的文檔:*「JXcore中的每個實例都稱爲子實例。子實例完全與主實例和其他子實例分離,因爲它們都運行在不同的V8上下文/隔離區中,這意味着它們不能共享或直接共享對象,變量等。「* –

回答

1

如果你字面上的意思是「線程安全的」,我認爲第一個問題必須是......你的JavaScript解釋器是線程安全的嗎? 是否允許兩個或多個線程擁有自己的解釋器上下文?是否設計了以及必要的內部互斥機制以允許兩個或更多線程同時訪問解釋器的內部上下文/狀態? (如果是這樣,你使用的這些設施究竟是規定的方式嗎?)

如果沒有,你的程序肯定會崩潰。線程將纏繞在解釋者的內部狀態上,並「下去」。

相關問題