javascript 同步互斥
in Web前端 on javascript, 互斥 - Hits()
javascript 是单线程的,但是事件,ajax回调,setTimeout等却是可以造成异步的。这让我有点有些担心,在写函数时是否需要注意数据互斥同步的情况?
我们需要认识到javascript的单线程的特性,它是一门可重入语言,每个函数调用都是原子的,它的事件回调也都是线性序列的,因此对于函数内部的每个数据都可以放心认为它是只被当前函数占有的。这句话是说在函数里面的数据访问修改都不用担心另外的线程可能修改它,你只注意不要自己在这个函数里面修改了它而自己还没注意,比如循环数组时又把这个数组中的某个元素给删除了。
下面的代码证实了这一原理:
(function() { var data = [1, 2, 3, 4, 5, 6, 7, 8, 9]; function atom_test() { var div = document.getElementById('div'); for (var i = 0; i < data.length; i++) { if (i == 3) { setTimeout(function() { data[3] = 'change4'; div.innerHTML += data[3] + '<br>'; }, 0); } div.innerHTML += data[i] + '<br>'; } } window.onload = function() { atom_test(); }; })();
结果如下:
1
2
3
4
5
6
7
8
9
change4
从结果可以看出,虽然在for循环中尝试使用setTimeout立即异步的修改data[3],但是这个修改还是等到主函数调用完成以后再执行。
我觉得这样避免了javascript的复杂性,很好。