Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

localStorage缺个lock功能

  在多线程程序的开发中,如果两个线程需要同时访问一块内存,不对其lock就会带来脏数据的问题。这个问题同样会出现在数据库等一些同享数据的地方。localStorage也是可以在不同进程间共享数据的东西,而且它本身还不带lock功能,这就要注意脏数据问题。
  JavaScript虽然是单线程的,但这是对一个页面来说的。浏览器会对不同的页面分配不同的进程(线程)。而localStorage是硬盘储存,是可跨进程的。如果一个页面正在对其处理到一半,操作系统切换到另一个线程处理就会出现脏数据。可以做个这样的测试 <script>
//a.html
(function callee(){
  localStorage["i"]=1;
  localStorage["i"]=0;
  setTimeout(callee);
})();
</script>
  这个程序即使运行也会认为localStorage["i"]的值永远是0吧?1的值只会瞬间存在,如果是单线程操作就可以视为不存在。但是有多个线程同时访问localStorage就完全有可能在这个瞬间访问到1这个值。比如下面这个程序 <script>
//b.html
(function callee(){
  if(localStorage["i"]==1)
    return document.write("ok");
  setTimeout(callee);
})();
</script>
  同时运行这两个页面就可以得到下面结果,b.html中的ok未必会立即出现,但是会出现。另外不要在两个选项卡中测试,因为Chrome会对后台线程降低优先级处理,造成两个页面的setTimeout刷新频率不一致。

  总之,localStorage就是缺个lock功能,看W3C那货也没打算实现这个了。如果非要解决这个问题可以考虑使用其它本地储存方式。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^