JS通过事件循环对并发进行建模。结果,没有比赛条件。那么,在程序的主要范围内,以下类型的安全操作的缺点是什么,请注意以下几点:
const m = new Map([["foo", true]]);
//...
m.set("bar", false);
即使我将其清空,m
也不会引起任何问题,因为依赖于此的每个操作m
都应考虑该空情况。
也许有人可以说明可变数据类型所伴随的典型问题。
我知道这个问题可能是基于观点的,因此,如果您认为不合适,请随时结束。
提前致谢!
JS通过事件循环对并发进行建模。结果,没有比赛条件。
让我们停在那儿。您可能不会获得两个不同的线程来尝试同时访问同一内存位置,但是您仍然可以让程序的并发部分异步地访问可变状态,而忽略它们并不孤单的事实。这仍然是比赛条件。
一个简单的例子:
var clock = out.value = 0;
async function incrementSlowly() {
if (clock == 12)
clock = 0; // reset
await delay(1000);
clock++;
out.value = clock;
}
function delay(t) { return new Promise(resolve => setTimeout(resolve, t)); }
<output id="out"></output>
<button onclick="incrementSlowly()">Tick!</button>
该clock
值永远不会大于12?尝试一下快速按下按钮时会发生的情况。
该incrementSlowly
函数的多个调用独立运行,并且在错误的时间进行检查-在它们的延迟期间,另一个实例可能已经clock
重新增加了一次。
在此示例中,我使用了可变变量,但是使用可变数据结构是相同的。当有多个代理通过不同方法访问结构时,情况并不总是那么明显。
使用不可变的数据结构会迫使您明确进行状态操作,并且很显然,incrementSlowly
实际上两次访问状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句