背景说明
今天代码审查的时候,发现有人在spring service中定义了SimpleDateFormat类型的字段,然后在后续方法中使用,头脑中立马出现了“线程不安全”几个大字,那么为什么SimpleDateFormat是线程不安全的呢?接下来从源码进行解析说明
源码解析
先看下类图:
其中我们日常使用format方法在父类DateFormat中,如下:
调用抽象方法,然后SimpleDateFormat实现如下:
其中标号1的calendar即为线程不安全的原因,因为它为父类DateFormat中的字段,代码如下
到此就彻底清楚了SimpleDateFormat为什么是线程不安全的了。
解决方案
那怎么解决这个问题呢:
1、SimpleDateFormat定义为局部变量
2、使用Java8提供的DateTimeFormatter (推荐)
3、加锁(不推荐)