我正在修复findbug
提出的 Lazy initialization of "static" fields should be "synchronized"
建议的问题。 This链接暗示要么我必须使字段变量volatile
或使初始化块。哪种方法更好?每种方法的优缺点是什么?“静态”字段的延迟初始化应该是“同步” - 如何修复它
回答
在你的例子中,你应该使用,因为volatile
不能保证原子性。 如果您使用volatile
,则可以初始化该对象的多个实例。
有没有更好。
只有几种不同的模式如何解决这个问题。有关该主题的完整讨论,请参阅here。
从这个意义上说:对于新手在做第一步,只需使用方法即可。对于“专业”使用 - 请参阅上述链接;并确定哪些解决方案最适合您的需求。
让我们说我有一个字符串声明,并得到初始化,这成为线程不安全。对于这种情况,我可以让字符串字段变成易失性的,以便它初始化的值可以立即用于所有线程。 – aravindkanna
* volatile *表示读/写**总是**访问**内存**。与访问可以驻留在本地缓存中的内容相比,访问内存比**慢一个数量级**!因此:是的,当然,挥发性解决了问题。但它的成本。因此,你小心使用它**。 – GhostCat
对于这个问题的每一个实例,如果我使用双重检查锁定习惯用法,就像您提供的资源中所建议的那样,这样会有效吗?或使整个“同步”块效率更高?问题是如果我有一个很大的方法,所有的指令都可以并行执行,除了初始化语句,使整个方法'synchronized'可能会影响效率。我认为这种损失超过了我们面临的波动。纠正我,如果我错了。 – aravindkanna
- 1. 静态字段初始化
- 2. JPA和EJB延迟初始化字段
- 3. 延迟初始化
- 4. 延迟初始化
- 5. 延迟初始化?
- 6. Java静态字段初始化
- 7. gcc中模板的非延迟静态成员初始化?
- 8. 新的延迟初始化
- 9. java球衣静态字段初始化
- 10. 静态字段无法初始化
- 11. 静态字段初始化使用AST
- 12. 通用静态字段初始化
- 13. 延迟初始化 - 休眠
- 14. 静态字段/属性初始化
- 15. 当静态字段初始化发生?
- 16. 静态初始化和静态同步方法锁定问题
- 17. 延迟初始化表
- 18. jQuery DataTables初始化延迟
- 19. Sakai Hibernate延迟初始化
- 20. 如何实现RAII +延迟初始化?
- 21. 如何延迟初始化类
- 22. Tensorflow初始化延迟
- 23. boost.serialization和延迟初始化
- 24. 延迟初始化总是返回空
- 25. 静态初始化是不应该运行
- 26. 我应该如何调用类静态初始化?
- 27. 静态类初始化阶段
- 28. 检测静态初始化阶段?
- 29. 如何防止静态方法中静态字段的多重初始化?
- 30. 访问Haxe静态字段的静态初始化的非静态数据
这取决于你的代码的细节。 – shmosel