看完之后 ”Java并发实践 http://jcip.net/" and "OSGI 实践 http://neilbartlett.name/blog/osgibook/“ 我发现一个非常有趣的特定主题:安全出版。以下内容来自 JCIP:
为了安全地发布对象,对象的引用和对象的状态必须同时对其他线程可见。正确构造的对象可以通过以下方式安全地发布:
- 从 a 初始化对象引用static初始化程序。
- 将对它的引用存储到volatile field.
- 将对它的引用存储到final field.
- 将对它的引用存储到由 ( 适当保护的字段中同步的) lock.
我的第一个问题:有多少 Java 开发人员意识到这个(问题)?
有多少现实世界的 Java 应用程序真正遵循这一点,这真的是一个真正的问题吗?我有一种感觉,99% 的已实现 JVM 并没有那么“邪恶”,即线程不能保证(事实上,它实际上(几乎)“不可能”)看到过时的数据,只是因为引用没有遵循上面的“安全发布习惯用法”。
按比例来说,可以公平地说,很少有程序员充分理解同步和并发。谁知道现在有多少服务器应用程序管理金融交易、医疗记录、警察记录、电话等,这些应用程序充满了同步错误,并且基本上是偶然工作的,或者非常偶然地失败(从来没有听说过有人得到幻像)电话费已添加到他们的电话账单中?),其原因从未真正调查或深究过。
对象发布是一个特殊的问题,因为它经常被忽视,并且编译器在这个地方进行优化是非常合理的,如果您不知道的话,可能会导致意外的行为:在 JIT 编译的代码中,存储一个指针,然后增加它并存储数据是一件非常合理的事情。您可能认为它是“邪恶的”,但从低层次来看,这确实是您所期望的 JVM 规范。 (顺便说一句,我听说在 JRockit 中运行的现实程序遇到了这个问题——这不仅仅是理论上的。)
如果您知道您的应用程序存在同步错误,但在当前硬件上的当前 JVM 中没有出现异常行为,那么 (a) 恭喜; (b),现在是时候开始“平静地走向消防出口”,在需要升级太多组件之前修复代码并教育程序员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)