常见面试题
SimpleDateFormat为什么是线程不安全的?
首先要实例化一个simpleDateFormat的对象,因为只有对共享变量同时进行读和写操作才会有线程安全问题。
SimpleDateFormat类里面使用了Calendar类来存储日期对象,它的parse方法会调用canlendar的clear方法,如下图所示。
而它的format方法先会将日期date设置到calendar对象,然后对这个对象进行读操作。这样才多线程调用共享的simpleDateFormat对象的format和parse时,就可能会数据不一致 或者 抛出异常。
怎么样解决或者避免simpleDateFormat的线程不安全问题?
不将simpleDateFormat实例化的对象做为静态对象使用
simpledateFormat对象不进行共享,也就是每个方法都会创建一个simpledateFormat局部对象来进行使用。
使用threadLocal类
threadLocal对象可以实现这样的效果,每个线程去调用该对象的get方法,都单独为每个线程创建一个新的对象。
这样就可以避免线程安全问题。
使用jdk1.8的LocalDateTime类
localDateTime.format方法为什么是线程安全的?因为它的日期和时间部分是常量,调用格式化器来进行格式化不会出现线程安全问题。
simpleDateFormat类重写了equals方法

