2011-11-27 56 views
2

是的,我知道,要求在Javascript正式的内存模型是一个没有希望的事业,所以我妥协,“所有的浏览器遵循这些规则”什么的。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内存模型..

+1

查看[这篇文章](http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)简要描述了javascript事件队列的工作原理以及为什么这不是一个竞争条件。 – jfriend00

+0

@ jfriend00谢谢 - 所以它基本上是没有重入的通常的消息泵实现。很高兴知道,即使除了“它是单线程的”之外没有关系:) – Voo

+0

是的,这是描述它的好方法。 – jfriend00

回答

4

没有任何竞争条件。在浏览器中

所有JavaScript代码是单线程的。

虽然它没有做其他任何事情的setTimeout回调将在UI线程上运行。

+0

因此,所有来自彗星服务器广播的用户事件setTimeouts()都被推送到一个消息队列中,然后由一个线程处理?不是最有效的东西,但我假设够简单。我可以在那里读到吗? – Voo

+0

@Voo:正确。 HTML5网络工作者允许您使用后台线程。阅读什么? – SLaks

+0

之前问我四处张望了一下,以及整个ECMA规范没有一次提到了“线程”的任何地方 - 所以我只是想知道你是否知道一些源在浏览器中的“实际执行”的 - 只是出于好奇和第二一瞥不可能存在。看着Web工作者的MDN文档 - 有趣的是,谢谢(避免通过消息解析来解决整个共享内存混乱是最好的解决方案)。 – Voo