相信大家都没有遇到过日期格式化的问题吧,那只有在高并发的时候,才会出现日期格式化异常
接下来给大家模拟一下高并发下日期格式化的情况
这样的话,我们利用高并发的环境,执行完成之后,如果出现异常,就会打印出异常信息了
由此可见,simpledateformat类不是线程安全的
原因:
在CalendarBuilder.establish()方法中先后调用了cal.clear()与cal.set(),也就是先清除cal对象中设置的值,再重新设置新的值。由于
Calendar内部并没有线程安全机制,并且这两个操作也都不是原子性的,所以当多个线程同时操作一个SimpleDateFormat时就会引
起cal的值混乱。类似地, format()方法也存在同样的问题
解决办法:
- 局部变量
将simpledateformat类的对象定义在局部变量中
不要放在类下面即可,但是这种的话,效率很低,建议在生产环境下不要这样使用
- synchronized锁方式
在parse的时候,锁进行保护即可,这种的话会导致其他线程处于等待状态,效率很低,不建议生产环境使用
- lock锁方式
通过lock.lock()加锁的方式来实现,最重要的是最后一定要finally来释放锁
- 推荐的方式:DateTimeFormatter的方式
DateTimeFormatter是java8新增的类,这个是线程安全的,可以在高并发的情况下使用
这个效率比较高,推荐在生产环境使用