1.问题。
作为一个准毕业生,在平时的练习中鲜有遇见多线程的练习,所以从来没有意识到SimpleDateFormat还会有线程安全问题。前几天看了Leader分享的几篇博文后,对这个问题有了一个较为深刻的认识。
一般我们使用SimpleDateFormat的时候都会把它定义成一个静态变量,从而避免频繁地创建它的对象实例,那么问题来了。这样在多线程情况下它的实例就会被多个线程共享,从它的源码中看出它内部都是用了一个Calendar成员去完成日期的相关处理的,因此当多个线程去执行日期操作的相关代码时就会出现预料不到的情况,也就是说它是线程不安全的。
光说不练假把式,眼见为实,我们来运行一下代码开看看这种异常情况。
多次运行后会出现:
这里多次运行后同一个字符串日期在转换成Date类型后再转回字符串类型后同一个日期竟然不一致了,这是线程不安全的一种表现。那么如何才能避免这种问题呢?在Java7中SimpleDateFormat本身不是线程安全的,所以我们需要依赖其他一些手段来实现线程安全性,而在Java8