Sch*_*jer 39 java multithreading safe-publication
在阅读" 实践中的Java并发 "和" 实践中的OSGI "后,我发现了一个非常有趣的特定主题; 安全出版.以下内容来自JCIP:
要安全地发布对象,必须同时使对象的引用和对象的状态对其他线程可见.正确构造的对象可以通过以下方式安全发布:
- 从静态初始化程序初始化对象引用.
- 将对它的引用存储到volatile字段中.
- 将对它的引用存储到最终字段中.
- 将对它的引用存储到由(同步)锁定正确保护的字段中.
我的第一个问题:有多少java开发人员知道这个(问题)?有多少真实世界的Java应用程序真正遵循这个,这真的是一个真正的问题吗?我有一种感觉,99%的已实现的JVM不是那种"邪恶",即一个线程不能保证(事实上它实际上(几乎)"不可能")看到陈旧数据只是因为引用不遵循上面的"安全出版成语".
Nei*_*fey 22
按比例,可以说很少有程序员能够充分理解同步和并发性.谁知道现在有多少台服务器应用程序正在管理金融交易,医疗记录,警察记录,电话等等,这些都充满了同步错误,基本上是偶然的,或者偶尔会失败(从未听说过任何人得到幻像)电话费被添加到他们的电话账单中?)原因从未真正被调查或深入到底.
对象发布是一个特殊的问题,因为它经常被忽略,而且如果您不了解它,那么编译器进行优化可能会导致意外行为是非常合理的:在JIT编译的代码中,存储指针,然后递增它并存储数据是一件非常合理的事情.您可能认为它是"邪恶的",但在较低的层次上,它实际上是您对JVM规范的期望.(顺便说一句,我听说JRockit中运行的现实程序遇到了这个问题 - 这不是纯粹的理论.)
如果您知道您的应用程序存在同步错误但在您当前的硬件上当前的JVM中没有行为错误,那么(a)表示祝贺; (b)现在是时候开始"冷静地走向火灾出口",在需要升级太多组件之前修复代码并教育程序员.
“这真的是一个真正的问题吗?”
是的,一点没错。即使是最琐碎的Web应用程序也必须面对并发性问题。例如,可以通过多个线程访问Servlet。
另一个问题是线程和并发很难正确处理。这几乎太难了。这就是为什么我们看到趋势如事务性内存出现,而诸如Clojure之类的语言有望使并发更易于处理的原因。但是,在这些成为主流之前,我们还有一段路要走。因此,我们必须尽我们所能。阅读JCiP是一个很好的开始。
| 归档时间: |
|
| 查看次数: |
8759 次 |
| 最近记录: |