자바가 하나의 스레드에서 실행되기 때문에 내 놀랍게도 많은 경쟁 조건이있는 것 같습니다. 전체 브라우저. 나는 다음과 같은 userscript으로 테스트했다 :. 큰 BLOCK
값으로
// ==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;
}
, 브라우저에 관계없이 탭이나 창에 잘못된 스크립트가 실행되는의 대부분이 응답하지 않는 것으로 보인다
을 그래서, 스크립트를 동기화, 그건 구조체가 이미 사용 중임을 나타내는 공유 플래그를 유지하고, 임의의 간격 폴링을 사용하여 무료 (쉬운 방법이지만 굶어 죽을 수 있음)하거나, "mutex"를 획득하려는 사람들의 대기열을 보류하고 유지 관리하는 데 충분합니다. 각 스크립트 호출이 중요한 섹션에 있기 때문에 일종의 모니터를 구현합니다.
경쟁 조건을 테스트하려면 2 개의 스레드가 여기에서 수행하지 않는 동일한 변수를 수정해야합니다. – Dalius