为什么建议你使用 LocalDateTime ,而不是 Date ?
JDK8 之后大家都推崇LocalDateTime,那LocalDateTime 到底比 Date 好在哪里呢?
1. Date如果不格式化,打印出的日期可读性差
Thu Mar 25 14:52:56 CST 2021 # Date
2021-03-25T14:52:56.254 # LocalDateTime
2. Date的日期工具类线程不安全
解析SimpleDateFormat的format方法的源码你会发现,里面有个 calendar 共享变量,但是这个共享变量没有做线程安全控制。
所以,当多个线程同时使用相同的SimpleDateFormat对象(如用 static 修饰的SimpleDateFormat)调用format方法时,多个线程会同时调用 calendar.setTime 方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。
在多并发情况下,SimpleDateFormat除了 format 是线程不安全以外,parse 方法也是线程不安全的。
parse 方法实际调用 alb.establish(calendar).getTime() 方法来解析,alb.establish(calendar) 方法里主要完成了
- 重置日期对象cal的属性值
- 使用calb中中属性设置cal
- 返回设置好的cal对象
但是这三步不是原子操作。
2.1 那么多线程并发如何保证SimpleDateFormat的线程安全呢?
- 避免线程之间共享一个SimpleDateFormat对象即可
这样的话每个线程使用时都创建一次SimpleDateFormat对象,创建和销毁对象的开销变大。 - 对使用format和parse方法的地方进行加锁
加锁可能会导致线程阻塞,性能差。 - 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象
3. Date对时间处理比较麻烦
Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,如果用Date来处理的话太过麻烦,
在JDK早期版本有getYear、getMonth这些方法,获取年月日很Easy,但这些在新的JDK里都被弃用了。
本文转自 为什么建议你使用 LocalDateTime ,而不是 Date? 如有不妥,请联系我删除