一尘不染

Java多线程与安全发布

java

在阅读了“ 实践中的Java并发 ”和“ 实践OSGI ”之后,我发现了一个非常有趣的特定主题。安全发布。以下是来自JCIP的内容:

为了安全地发布对象,必须同时使对该对象的引用和该对象的状态对其他线程可见。可以通过以下方式安全地发布正确构造的对象:

  • 从静态初始化程序初始化对象引用。
  • 将对它的引用存储到可变字段中。
  • 将对它的引用存储到最终字段中。
  • 将对它的引用存储到由(同步)锁适当保护的字段中。

我的第一个问题:有多少个Java开发人员知道此问题?实际有多少个实际的Java应用程序在关注这个,这真的是一个真正的问题吗?我有一种感觉,就是99%的已实现JVM都不存在“邪恶”的现象,即不能保证线程(实际上,它的实际(几乎)是“不可能的”)看到陈旧的数据只是因为引用未遵循上面的“安全出版物成语”。


阅读 356

收藏
2020-03-04

共1个答案

一尘不染

从比例上讲,可以说几乎没有程序员充分了解同步和并发性。谁知道现在有多少服务器应用程序在管理财务交易,医疗记录,警察记录,电话等,这些同步器中充满了同步错误,本质上是偶然发生的,或者偶而会失败(从来没有听说过有人幻像)电话费已添加到他们的电话帐单中?)的原因从来没有真正被调查过或深入了解过。

对象发布是一个特别的问题,因为它经常被忽略,在这里,编译器进行优化是很合理的,如果您不了解它,可能会导致意外行为:在JIT编译的代码中,存储指针,然后增加它并存储数据是一件非常合理的事情。您可能会认为这是“邪恶的”,但是从低层次看,这确实是您期望JVM规范的方式。(顺便说一句,我听说过在JRockit中运行的现实程序会遇到此问题-这不完全是理论上的。)

如果您知道您的应用程序存在同步错误,但是在当前硬件上的当前JVM中没有出现异常,那么(a)表示祝贺;(b),现在是时候开始“从容地走向火出口”,修复代码并在需要升级太多组件之前对程序员进行教育。

2020-03-04