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");

 

posted @ 2020-09-24 20:14  鼠标的博客  阅读(431)  评论(0编辑  收藏  举报