JavaScript:异步但不是多线程?

标签 javascript multithreading

我有以下内容:

function NumberFormatter(){
   ...
   function helper(){
   ...
       var tempvar;
   ...
   }
   function format(num){
   ...
       helper()
   ...
   }
}

//there is a single instance of FT

var FT = new NumberFormatter()
FT.format(123)

对象的状态没有改变。

在多线程上下文中,如果几乎同时从两个不同的地方调用 format(),此代码是否会失败?

是否有一种简单的方法来锁定对象,还是持有 1000 个实例更好?


答案:(总结所有张贴在这里...)

  • 不会,代码不会失败(因为JavaScript中没有真正的多线程)

  • 无法锁定对象,您也不需要

  • 你可以有一个实例。无需创建 1000 个实例


对于那些不相信的人,proofcode:

<script type='text/javascript'>

    function get_random_color() {
        var letters = '0123456789ABCDEF'.split('');
        var color = '#';
        for (var i = 0; i < 6; i++ ) {
            color += letters[Math.round(Math.random() * 15)];
        }
        return color;
    }

    setInterval('document.getElementById("a").style.backgroundColor=get_random_color()', 10)

    //***  setInterval() stops when heavy calculations are done   ***//

    document.getElementById("b").onclick = function(){
        for(var i=0;i<10000000; i++){
            Math.atan2(Math.round(1000))
        }
    }
</script>

最佳答案

两件事。首先,您唯一需要担心并发问题的时候是在处理外部资源或更改对象状态时。因为调用 formatNum 不会改变 NumberFormatter 的状态,所以完全没有什么可担心的。

其次,javascript doesn't do multi threading .所以这是一个有争议的问题。

关于JavaScript:异步但不是多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5664011/

相关文章:

javascript - 如何使用来自 reducer 的一些数据更新组件的状态

c# - 停止 .NET 线程池中的所有线程?

multithreading - 从 Go 应用程序中的线程低级 C/C++ 代码层调用 Go 回调

javascript - AngularJS 指令在单击时添加类,但如果单击则将其删除并添加到另一个元素

iphone - 如何停止失控的进程

java - 具有多个限制的线程池

multithreading - 您可以在Clojure中使用 `send`和 `send-off`混合代理 Action 提交吗?应该发生什么?

javascript - 数据绑定(bind)到 Windows 8 ListView

javascript - 如何使用 forEach 做决定

javascript - 如何从angularjs获取天数