在javascript中使用闭包之间的变量是否是线程安全的?

时间:2015-04-20 19:32:16

标签: javascript multithreading thread-safety closures protected

我正在阅读关于私人/受保护成员的article"仿真" 使用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)。

但是,在并发作用域中,这种方式是否安全?是否有可能另一种方法可以更改调用者变量的值,从而使数据一致性失效?

1 个答案:

答案 0 :(得分:1)

如果字面上表示"线程安全,"我认为第一个问题必须是......你的JavaScript解释器是否是线程安全的? 允许两个或多个线程拥有自己的解释器上下文吗? 设计是否具有必要的内部互斥机制,以允许两个或多个线程同时访问解释器的内部上下文/状态? (如果是这样,你是否按照规定的方式完全使用这些设施?)

如果没有,你的程序肯定会崩溃。线程将最终在解释器的内部状态上涂鸦,并且"向下走。"