java.lang.NumberFormatException: multiple points
一直听说过SimpleDateFormat是线程不安全的,从没在项目中碰到过,最近一个项目的开发,总是偶偶遇到下图的报错,查了下才知道,是多线程引起,这里做个记录
问题报错日志:
背景:使用elasticsearch检索日志,因为某种原因,需要将检索的起止时间由字符串值转为long格式值;
后来排查到,前端在点击一个柱状图的柱子下钻时,echarts事件没写对,默认所有柱子都会同时发一次下钻请求(但是参数用的一个,同时发了30个左右)
getLongTime()方法如下:
网上搜索,查到这个是因为SimpleDateFormat类是非同步,线程不安全的,打开源码找到了说明
这是alibaba java 开发手册中描述的,眼拙,没重视......
如何解决:
方法一:不要在工具类中声明一个全局的SimpleDateFormat实例,把它放到方法中,每次使用的时候new 一个实例,除非需要在大批量的数据处理中使用它
缺点:频繁new SimpleDateFormat对象,销毁对象,不好看......
方法二:使用ThreadLocal保存每个线程的SimpleDateFormat对象
public static ThreadLocal<SimpleDateFormat> safeSdf = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); safeSdf.get().parse(timeStr)
方法三:使用java8的DateTimeFormatter,源码提示了是thread-safe的
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");