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

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

鄂伦春网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。成都创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

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

java中SimpleDateFormat线程不安全的示例分析
编写一个简单的测试程序,如:

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

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

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

 Date formats are notsynchronized.

 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中SimpleDateFormat线程不安全的示例分析

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

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

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

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

  • 有异常,java.lang.NumberFormatException

如,

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

再如,

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

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

解决方法

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

 Date formats are notsynchronized.

 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类,如:

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

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

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

(二) 访问format时,添加synchronized

改造SimpleDateFormatExample类,如:

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

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

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

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

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

(三)使用TheadLocal

改造SimpleDateFormatExample类,如:

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

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

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

(四)使用FastDateFormat

FastDateFormat类在Apache Common Langs包下面,

 该类是线程安全的

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

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

改造SimpleDateFormatExample类,如:

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

完整的类为:

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

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

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

(五)使用Joda Time

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

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


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

改造SimpleDateFormatExample类,如:

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

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

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

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


本文标题:java中SimpleDateFormat线程不安全的示例分析
标题路径:http://myzitong.com/article/geejeg.html