温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-09-09 17:01:24 来源:亿速云 阅读:153 作者:小新 栏目:编程语言

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

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

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

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

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

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

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

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

  • 有异常,java.lang.NumberFormatException

如,

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

再如,

java中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.

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI