千家信息网

java中SimpleDateFormat线程不安全的示例分析

发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,这篇文章主要为大家展示了"java中SimpleDateFormat线程不安全的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java中Simpl
千家信息网最后更新 2024年12月03日java中SimpleDateFormat线程不安全的示例分析

这篇文章主要为大家展示了"java中SimpleDateFormat线程不安全的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java中SimpleDateFormat线程不安全的示例分析"这篇文章吧。

java.text.SimpleDateFormat主要负责日期的转换与格式化。如:


编写一个简单的测试程序,如:

但是,在多线程的环境中,使用类java.text.SimpleDateFormat容易造成数据转换及处理的不正确,因为该类并不是线程安全的。

我们可以从SimpleDateFormat类的javadoc描述中看到如下一句话:

Date formats are not synchronized.

It is recommended to create separate format instances for each thread.

If multiple threads access a format concurrently, it must be synchronized externally.

Date formats没有同步。

建议为每一个线程创建独立的format对象。

如果多个线程并发访问一个format,那么,一定要在外部实现同步(synchronized)。

也就是说,在多线程下我们需要做些额外的保护措施,去保证其正确处理,否则是不安全的。接下来,让我们一起来看一下,多线程中到底会发生什么?

线程不安全示例



运行结果主要包含如下几个错误:

  • 无异常,日期解析出现错误


  • 有异常,java.lang.NumberFormatException

如,


再如,


那么问题来了,如何保证运行正常呢?

解决方法

其实,从SimpleDateFormat的javadoc中已经看到有处理的方法了。

Date formats are not synchronized.

It is recommended to create separate format instances for each thread.

If multiple threads access a format concurrently, it must be synchronized externally.

接下来,先从这个描述信息给出相关的解决方法。

(一)每次都新建SimpleDateFormat对象

改造SimpleDateFormatExample类,如:


执行上述Main.java类,得到正确结果:


(二) 访问format时,添加synchronized

改造SimpleDateFormatExample类,如:


或者在使用format对象的方法前添加synchronized修饰,如:


同样,执行上述Main.java类,可以得到正确结果:


(三)使用TheadLocal

改造SimpleDateFormatExample类,如:


同样,执行上述Main.java类,可以得到正确结果:

(四)使用FastDateFormat

FastDateFormat类在Apache Common Langs包下面,

该类是线程安全的

如果是Maven工程,其添加依赖包如下:


改造SimpleDateFormatExample类,如:


完整的类为:


同样,执行上述Main.java类,可以得到正确结果:


(五)使用Joda Time

DateTimeFormatter 类Joda-Time包下面, 该类是线程安全的

如果是Maven工程,其添加依赖包如下:



改造SimpleDateFormatExample类,如:


同样,执行上述Main.java类,可以得到正确结果:


以上是"java中SimpleDateFormat线程不安全的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0