讓我驚訝的是,似乎沒有競爭條件,因爲Javascript運行在單線程整個瀏覽器。我曾與以下userscript測試它:
// ==UserScript==
// @name test-concurrency
// @namespace mw.tools
// @include /^http://localhost//
// @version 1
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
var BLOCK = 1000;
var ATOM = 'foo';
switch (window.location.search) {
case '?inc':
setInterval(function() {
var i;
for (i = 0; i < BLOCK; i++) {
GM_setValue(ATOM, GM_getValue(ATOM, 0) + 1);
}
document.title = '' + GM_getValue(ATOM, 0) + ' || ' + (GM_getValue(ATOM, 0) % BLOCK);
}, 1);
break;
case '?ver':
setInterval(function() {
var v;
var v0;
v0 = GM_getValue(ATOM);
for (i = 0; i < BLOCK; i++) {
v = GM_getValue(ATOM);
if (v != v0) {
document.title = v0 + ' || broken';
alert('BORKEH!!1111oneone');
}
}
document.title = v0;
}, 1);
break;
}
隨着大BLOCK
值,瀏覽器似乎大多是反應遲鈍,無論標籤或窗口違規腳本在運行,其中
所以,同步腳本,它是足以保持一些共享的標誌告訴結構已被使用,並且隨機間隔輪詢使其變爲空閒(簡單的方法,但可以餓死),或者使用廣播並維持待獲得的「互斥體」隊列, ,實現一個監視器(有點,因爲每個腳本調用都在關鍵部分)。
爲了測試競態條件,2個線程應該試圖修改同一個變量,這是你在這裏沒有做的。 – Dalius 2016-05-29 11:46:01