背景说明
今天代码审查的时候,发现有人在spring service中定义了SimpleDateFormat类型的字段,然后在后续方法中使用,头脑中立马出现了“线程不安全”几个大字,那么为什么SimpleDateFormat是线程不安全的呢?接下来从源码进行解析说明
源码解析
先看下类图:

其中我们日常使用format方法在父类DateFormat中,如下:

调用抽象方法,然后SimpleDateFormat实现如下:

其中标号1的calendar即为线程不安全的原因,因为它为父类DateFormat中的字段,代码如下

到此就彻底清楚了SimpleDateFormat为什么是线程不安全的了。
解决方案
那怎么解决这个问题呢:
1、SimpleDateFormat定义为局部变量
2、使用Java8提供的DateTimeFormatter (推荐)
3、加锁(不推荐)

本文探讨了SimpleDateFormat在多线程环境下的线程不安全问题。通过源码分析,揭示了其内部calendar字段导致的安全隐患。提出了将SimpleDateFormat作为局部变量、使用DateTimeFormatter或加锁作为解决方案,并推荐使用Java8的DateTimeFormatter。
最低0.47元/天 解锁文章
803





