这两天工作中看到有人把SimpleDateFormat对象放在了ThreadLocal里,当时有点疑惑,ThreadLocal的主要作用肯定是用来做线程隔离的,那么为什么SimpleDateFormat这种简单的时间格式转换工具也要做线程隔离呢?
查阅了一些博客,翻看了源码,搞懂了。
记录一下,以便回顾。
SimpleDateFormat是线程不安全的,我们直接上代码。
一般来说,这种时间格式转换工具,我们都会做成一个公共工具类,如下所示:
public class DateUtil {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String formatDate(Date date)throws ParseException {
return sdf.format(date);
}
public static Date parse(String strDate) throws ParseException{
return sdf.parse(strDate);
}
}
然后我们模拟多线程看下运行结果
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 15; i+