Java理论与实践: 修复Java内存模型,第1部分 - 编程入门网
并不是不可变的)和内 存操作重新排序的意外结果。这也防止了其他一些有效的编译器优化。如果您阅 读了关于双重检查锁定问题(double-checked locking problem)的任何文章( 参阅 参考资料),您将会记得内存操作重新排序是多么的混乱,以及当您没有 正确地同步(或者没有积极地试图避免同步)时,细微却严重的问题会如何暗藏 在您的代码中。更糟糕的是,许多没有正确同步的程序在某些情况下似乎工作得 很好,例如在轻微的负载下、在单处理器系统上,或者在具有比 JMM 所要求的 更强的内存模型的处理器上。
“重新排序”这个术语用于描述几种对内存操作的真实明显的重新排序的类 型: 当编译器不会改变程序的语义时,作为一种优化它可以随意地重新排序某些 指令。 在某些情况下,可以允许处理器以颠倒的次序执行一些操作。 通常允许缓存以与程序写入变量时所不相同的次序把变量存入主存。 从另一线程的角度来看,任何这些条件都会引发一些操作以不同于程序指定 的次序发生 —— 并且忽略重新排序的源代码时,内存模型认为所有这些条件都 是同等的。 JSR 133 的目标 JSR 133 被授权来修复 JMM,它有几个目标: 保留现有的安全保证,包括类型安全。 提供 无中生有安全性(out-of-thin-air safety)。这意味着变量值并不是 “无中生有”地创建的 —— 所以对于一个线程来说,要观察到一个变量具有变 量值 X,必须有某个线程以前已经真正把变量值 X 写入了那个变量。 “正确同步的”程序的语义应该尽可能简单直观。这样,“正确同步的”应 该被正式而直观地定义(这两种定义应该相互一致)。 程序员应该要有信心创建多线程程序。当然,我们没有魔法使得编写并发程 序变得很容易,但是我们的目标是为了减轻程序员理解内存模型所有细节的负担 。 跨大范围的流行硬件体系结构上的高性能 JVM 实现应该是可能的。现代的处 理器在它们的内存模型上有着很大的不同;JMM 应该能够适合于实际的尽可能多 的体系结构,而不会以牺牲性能为代价。 提供一个同步习惯用法(idiom),以允许我们发布一个对象并且使得它不用 同步就可见。这是一种叫做 初始化安全(initialization safety)的新的安全 保证。 对现有代码应该只有最小限度的影响。 值得注意的是,有漏洞的技术(如双重检查锁定)在新的内存模型下仍然有 漏洞,并且“修复”双重检查锁定技术并不是新内存模型所致力的一个目标。( 但是, volatile 的新语义允许通常所提出的其中一个双重检查锁定的可选方法 正确地工作,尽管我们不鼓励这种技术。) 从 JSR 133 process 变得活跃的三年来,人们发现这些问题比他们认为重要 的任何问题都要微妙得多。这就是作为一个开拓者的代价!最终正式的语义比原 来所预料的要复杂得多,实际上它采用了一种与原先预想的完全不同的形式,但 非正式的语义是清晰直观的,将在本文的第 2 部分概要地说明。 Java理论与实践: 修复Java内存模型,第1部分(2)时间:2010-12-20 IBM Brian Goetz同步和可见性 大多数程序员都知道, synchronized 关键字强制实施一个互斥锁(互相排 斥),这个互斥锁防止每次有多个线程进入一个给定监控器所保护的同步语句块 。但是同步还有另一个方面:正如 JMM 所指定,它强制实施某些内存可见性规 则。它确保了当存在一个同步块时缓存被更新,当输入一个同步块时缓存失效。 因此,在一个由给定监控器保护的同步块期间,一个线程所写入的值对于其余所 有的执行由同一监控器所保护的同步块的线程来说是可见的。它也确保了编译器 不会把指令从一个同步块的内部移到外部(虽然在某些情况下它会把指令从同步 块的外部移到内部)。JMM 在缺乏 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |