Java中的SimpleDateFormat不是线程安全的请谨慎使用

        Java 中的 SimpleDateFormat是一个非常常见的类,通常用于将Date 格式化为 String并将String 解析为 Java 中的 Date,特别是在 Java 8 之前的世界中,但如果不小心使用,它可能会导致非常微妙且难以调试的问题,因为 DateFormatSimpleDateFormat两者都不是线程安全的并且有错误。对format()parse()方法的调用会改变DateFormat类的状态,并且应该在外部同步以避免任何问题,但许多 Java 开发人员没有意识到这些。这就是为什么最好完全避免使用 SimpleDateFormat 类,特别是如果您使用 Java Se 8 或更高版本(如 Java SE 11 或 Java SE 17)。以下是在 Java 中使用SimpleDateFormat时应注意的几点:

Java 中的 SimpleDateFormat 不是线程安全的

1) 使用本地DateFormat或SimpleDateFormat对象在 Java 中转换或格式化日期。使它们成为本地确保它们不会在多个线程之间共享。
2)如果您在Java中共享SimpleDateFormat类的Date ,那么您需要外部 同步对format()和parse()方法的调用,因为它们会改变DateFormat对象的状态,并且在格式化字符串或创建字符串时可能会产生微妙且难以修复的错误Java 中的日期。最好是完全避免共享 DateFormat 类。
3) 如果你可以选择使用 JODA 日期时间库 进行与日期和时间相关的操作。它易于理解并可通过 Java Date API 移植,并解决与Java 中SimpleDateFormat相关的所有线程安全问题。
4) Java 中SimpleDateFormat的另一个很好的替代方案是 Apache 的commons.lang包,它包含一个名为  FastDateFormat实用程序类的类,以及 Java 中SimpleDateFormat的线程安全替代方案。
5) 同步DateFormat和SimpleDateFormat的另一种方法是使用 ThreadLocal,它在每个线程的基础上创建SimpleDateFormat ,但如果不小心使用,它可能会成为严重内存泄漏和 java.lang.OutOfMemoryError的根源。因此,请避免这样做,直到您没有其他选择为止。


        这就是Java 中的SimpleDateFormat 的全部内容。许多人指出了 Format 类设计中的缺陷,但不幸的是,Sun 或 Oracle 没有在任何版本中解决这些缺陷,甚至在 JDK7 中也是如此。SimpleDateFormat仍然是首选,因为它在标准库上可用,但应谨慎使用。
 

你可能感兴趣的:(java,开发语言)