SimpleDateFormat是线程不安全的,在并发操作时可能会出现时间转换错误等情况。
之前总是听到说sdf是线程不安全的,也只是记下来,并不知道它为什么是不安全的。
今天在排查一个数据问题的时候,发现数据的总数是一样的,但是进行日期范围的筛选之后的结果是不一样的。突然想到,在处理数据的代码中使用到了sdf.format()方法,一番测试之后发现果真是sdf线程不安全导致的问题。在此记录一下。
为什么是线程不安全的?
在源码注释中有如下内容说明sdf是线程不安全的
* 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继承自java.text.DateFormat类,在DateFormat类中有一个calendar变量,子类继承 这一变量
protected Calendar calendar;
同一个sdf的所有操作都是共享同一个calendar变量
format方法
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// Convert input date to time field list
calendar.setTime