我认为我不需要在JavaScript中处理同步问题和关键部分,因为它是单线程的。嗯......
多个网站将数据发送到多个本地托管的页面,这些页面同时访问同一块内存,从而导致竞争状态。
这是我刚写的一个简单的代码,可让两个孩子计算结果并将其发送回父母:
window.addEventListener("load", function() {
//threads analogy in JavaScript!
if (location.search.length) {
//receiver
var query = decodeURIComponent(location.search.slice(1));
var data = JSON.parse(query).value;
//handle data.
//start CRITICAL SECTION
localStorage.storage = +localStorage.storage + data;
//end CRITICAL SECTION
location.href = "about:blank"; //exit
} else {
//master
sum = document.getElementById("sum");
sum.innerText = localStorage.storage = "0";
window.addEventListener("storage", function() {
//data received from receiver
sum.innerText = localStorage.storage;
});
}
});
多个页面将计算一个数字并发送回父母:
var frame = document.createElement("iframe");
frame.src = 'http://localhost:8080/master.html?{"value":1}'; //port 8080
document.body.appendChild(frame);
var n=0;
frame.addEventListener("load", function(){
if(n) document.body.removeChild(frame);
else n=1;
}
由于localStorage在同一个域的页面之间共享,并且所有这些页面都在不同的线程上运行,因此在JavaScript中会导致竞争条件。
我尝试创建2个实例,每个实例同时并连续发回10次1
的值。我最后得到的结果总是少于20个。
在C中,有一个互斥体来拯救我们的生命。如何在没有锁定机制的JavaScript中解决这个问题?
此图表可能更容易理解: