“静态”字段的延迟初始化应该是“同步” - 如何修复它
我正在修复findbug
提出的 Lazy initialization of "static" fields should be "synchronized"
建议的问题。 This链接暗示要么我必须使字段变量volatile
或使初始化块。哪种方法更好?每种方法的优缺点是什么?“静态”字段的延迟初始化应该是“同步” - 如何修复它
在你的例子中,你应该使用,因为volatile
不能保证原子性。 如果您使用volatile
,则可以初始化该对象的多个实例。
有没有更好。
只有几种不同的模式如何解决这个问题。有关该主题的完整讨论,请参阅here。
从这个意义上说:对于新手在做第一步,只需使用方法即可。对于“专业”使用 - 请参阅上述链接;并确定哪些解决方案最适合您的需求。
让我们说我有一个字符串声明,并得到初始化,这成为线程不安全。对于这种情况,我可以让字符串字段变成易失性的,以便它初始化的值可以立即用于所有线程。 – aravindkanna
* volatile *表示读/写**总是**访问**内存**。与访问可以驻留在本地缓存中的内容相比,访问内存比**慢一个数量级**!因此:是的,当然,挥发性解决了问题。但它的成本。因此,你小心使用它**。 – GhostCat
对于这个问题的每一个实例,如果我使用双重检查锁定习惯用法,就像您提供的资源中所建议的那样,这样会有效吗?或使整个“同步”块效率更高?问题是如果我有一个很大的方法,所有的指令都可以并行执行,除了初始化语句,使整个方法'synchronized'可能会影响效率。我认为这种损失超过了我们面临的波动。纠正我,如果我错了。 – aravindkanna
这取决于你的代码的细节。 – shmosel