在单线程环境中由可变数据类型引起的典型问题是什么?

书面

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MPI派生的数据类型问题是由结构填充和无阻塞通信缓冲区的问题引起的

无法在闪亮的Flexdashboard中显示可变数据类型

可变数据类型的Django模型

集合为什么不能存储可变数据类型?

NodeJS性能问题-单线程

类似于python中字符串的可变数据类型

读取Java中具有可变数据类型的CSV

在C中扫描和打印可变数据类型“ double”

JavaScript中+0的问题是什么?

对象属性的可变数据类型,而不是属性的值?

为不可变数据类型实现迭代器

在单线程环境中使函数可重入有什么意义?

Java中的单线程异步处理

Java在单线程环境中为单个事件源提供多个Swing侦听器

单线程通过单线

在浏览器中,多线程WebAssembly的速度比单线程慢,为什么?

为什么C#中的多线程快速排序比单线程慢

为什么在我的代码中单线程比多线程快?

C 中简单线程池和 TCP 侦听器的问题

为什么我的多线程比单线程慢?

mysql或其他数据库中“空”值的问题是什么?

Python的可变数量输入数据的功能是什么?

为什么我会放置一个synchronized块单线程方法中?

什么是衡量Java中单线程复杂算法的最佳宏基准测试工具/框架?

当节点为单线程时,为什么在node.js中需要连接池?

为什么gevent需要同步,因为它在单线程中

有什么方法可以使dispatch_queue_t在单线程中工作?

单线程应用程序中的实体框架数据库连接

C#中ParameterInfo的数据类型是什么?