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