目录
一、场景
二、SimpleDateFormat线程为什么是线程不安全的呢?
验证SimpleDateFormat线程不安全
三、FastDateFormat源码分析
实践
四、结论
一、场景
在java8以前,要格式化日期时间,就需要用到SimpleDateFormat。
但我们知道SimpleDateFormat是线程不安全的,处理时要特别小心,要加锁或者不能定义为static,要在方法内new出对象,再进行格式化。很麻烦,而且重复地new出对象,也加大了内存开销。
后来Apache 在commons-lang 包中扩展了FastDateFormat对象,它是一个线程安全的,可以用来完美替换SimpleDateFormat。
二、SimpleDateFormat线程为什么是线程不安全的呢?
来看看SimpleDateFormat的源码
//FastDateFormatpublic static FastDateFormat getInstance(final String pattern) { return CACHE.getInstance(pattern, null, null);}
如图可证,是使用了ConcurrentMap 做缓存。且key值是格式,时区和locale(语境)三者都相同为相同的key。
四、结论
java8之前,可使用FastDateFormat 替换SimpleDateFormat,达到线程安全的目的;
java8及以上的,java8提供了一套新的日期时间API,可以使用DateTimeFormatter来代替SimpleDateFormat。具体的源码分析,可以看这里,传送门:万字博文教你搞懂java源码的日期和时间相关用法