【问题标题】:Javascript memory modelJavascript内存模型
【发布时间】:2012-01-07 04:10:42
【问题描述】:

是的,我知道在 Javascript 中要求一个正式的内存模型是一项无望的工作,所以我正在接受“所有浏览器都遵循这些规则”之类的东西。

我的问题如下:我必须以定义的时间间隔将事件发送到服务器,但这样做时可能会将事件添加到我的数组中,即:

function storeEvent(event) {
    // may be called at any time
    storedEvents.push(event);
}

function broadcastEvents() {
    if (storedEvents.length !== 0) {
        var eventString = JSON.stringify(storedEvents);
        storedEvents = [];
        // send eventString to server
    }
    window.setTimeout(broadcastEvents, BROADCAST_TIMER);
}

那里有一个明显的竞争条件,甚至没有想到缺少的内存屏障。

怎么办?这里真的缺少Java内存模型..

【问题讨论】:

  • 请参阅this post,了解有关 javascript 事件队列如何工作以及为什么这不是竞争条件的简要说明。
  • @jfriend00 谢谢 - 所以它基本上是通常的消息泵实现,无需重入。很高兴知道,即使除了“它是单线程的”之外无关紧要:)
  • 是的,这是一个很好的描述方式。

标签: javascript memory shared-memory


【解决方案1】:

没有任何竞争条件。

浏览器中的所有 JavaScript 代码都是单线程的。

setTimeout 回调将在 UI 线程上运行,而它不执行任何其他操作。

【讨论】:

  • 所以所有用户事件、setTimeouts()、来自comet 服务器的广播……都被推送到一个消息队列中,然后由一个线程处理?不是最有效的事情,但我认为很简单。我可以在某个地方读到吗?
  • @Voo:正确。 HTML5 网络工作者允许您使用后台线程。阅读什么?
  • 在询问之前,我环顾四周,整个 ECMA 规范并没有在任何地方提到“线程”——所以我只是想知道你是否知道浏览器中“实际实现”的一些来源——只是出于好奇,乍一看不太可能存在。查看了 Web Workers 的 MDN 文档 - 很有趣,谢谢(通过消息解析避免整个共享内存混乱无疑是最好的解决方案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-02-28
  • 2012-08-11
  • 2011-06-03
  • 1970-01-01
  • 2013-09-29
  • 2016-05-03
相关资源
最近更新 更多