通过HTML5本地存储实现同步原语



考虑一个场景,其中浏览器具有两个或多个标签,指向相同的原点。不同选项卡的不同事件循环可以导致竞赛条件,同时访问本地存储,而不同的选项卡可以潜在地覆盖彼此在本地存储中的变化。

我正在编写一个将面临这种种族条件的Web应用程序,因此我想知道在这种情况下可以使用的不同同步基础。

我对相关的W3C规范的阅读,以及本博客文章末尾的伊恩·希克森(Ian Hickson)的评论,这表明发生了什么事浏览器 - 全球互斥可控制对每个域localStorage的访问。JavaScript执行的每个单独的"线程"(有关我相当有信心的含义,请参见下文)必须尝试在检查本地存储时尝试获取存储Mutex(如果还没有)。一旦获得静音,它不会放弃,直到完全完成为止。

现在,什么是 thread ,线程完成是什么意思?唯一有意义的事情(这是唯一与Hixie声称互惠件使事情"完全安全"的说法真正一致的是A thread 是某些浏览器上下文中的JavaScript代码事件。(请注意,一个可能的事件是刚刚加载了<script>块。)通常,浏览器中JavaScript的性质是<script>块中的代码或处理程序中的任何事件中的代码,直到停止;也就是说,运行到<script>主体的末端,否则运行直到事件处理程序返回。

因此,鉴于,储存互联克应该做什么是强迫所有共享域脚本在试图索取互斥X时的数字中之一时阻止的。他们将阻止直到拥有的线程完成&mdash;直到<script>标签代码耗尽,或直到事件处理程序返回。该行为将从规格中实现此保证:

因此,存储对象的长度属性以及该对象的各个属性的值在执行脚本时无法更改,而不是通过脚本本身可以预测的方式。

但是,看来基于Webkit的浏览器(Chrome和Safari,也许还有Android浏览器,现在也许是Opera?)不用忧郁的实现,这使您处于促使您询问的情况下问题。如果您关注这种种族条件(一种完全合理的态度),则可以使用博客文章中建议的锁定机制(由某人或为Stackoverflow工作的人:)检测肮脏的写作。( edit &mdash;现在我考虑过,rdbms式版本机制将是有问题的,因为仍然是是一个竞赛条件检查版本!)

最新更新