![]() |
1
76
日期格式不是线程安全的,这意味着它们维护状态的内部表示。如果多个线程同时访问同一个实例,在静态上下文中使用它们可能会产生一些非常奇怪的错误。 我的建议是将变量设置为使用它们的地方的局部变量,而不是将它们设置为类的静态属性。在初始化类时,您可能正在执行此操作,因此可以在构造函数中执行此操作:
如果您需要在多个地方使用格式化程序,您可以只制作模式
这个 FindBugs documentation 对于这个问题来说:
以及 javadoc for DateFormat 建议:
Jack Leow's answer 对于静态使用“today”的语义也有一个很好的观点。 顺便说一句,我实际上已经看到这种情况发生在高流量的生产环境中,而且一开始调试是一件非常令人困惑的事情;因此,根据我的经验,findbugs警告实际上是一个有用的建议(与其他一些静态分析规则不同,这些规则有时看起来很挑剔)。 |
![]() |
2
14
Commons Lang 有一个 FastDateFormat 线程安全的对象。 但它只进行格式化,不进行解析。 如果你能使用通用语言,这可能对你很有用。
|
![]() |
3
4
你确定不是吗
?这就是错误消息所指示的。
我认为它的目标是
|
![]() |
4
4
我不确定findbugs是否在抱怨这一点,但我发现您的代码存在一个问题,那就是您正在定义
想想如果应用程序运行了几天会发生什么?
这可能根本不是代码中的错误,但目的并不明确,我相信 可以 成为findbugs抱怨的对象。 |
![]() |
5
2
另一个没有提到的方法是使用threadlocal。见 http://www.javacodegeeks.com/2010/07/java-best-practices-dateformat-in.html 更多信息+3个选项之间的性能比较:
使用threadlocal的示例:
用途:
|
![]() |
6
0
一方面,它不安全。 |
![]() |
7
0
我想这是因为格式不是线程安全的? (我没有看到findbugs抱怨什么,你能提供 警告文本?) |
![]() |
8
0
通过将对日期格式的所有引用包装在同步块中,可以消除此问题-只需确保所有调用都包装在 相同的 同步对象! |