SimpleDateFormat在多线程场景下导致的异常

背景

        现在正处于老项目重新构建,需要将历史接受数据分流,故而需求是先试点再切换,上线一个区域切换方案来观察数据接收是否有问题,没问题再全切。

        其中老项目生产版本是JDK8,新项目生产版本也是JDK8,但是由于未知原因,JDK8的语法在测试编译不通过,导致无法用LocalDate去做时间处理,故而选择SimpleDateFormat。

        为了方便,我直接将SimpleDateFormat设置为全局变量,为后续生产上的问题埋下大坑。

先看报错详细:

第一种:For input string: ""

java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[?:1.8.0_25]
	at java.lang.Long.parseLong(Long.java:601) ~[?:1.8.0_25]
	at java.lang.Long.parseLong(Long.java:631) ~[?:1.8.0_25]
	at java.text.DigitList.getLong(DigitList.java:195) ~[?:1.8.0_25]
	at java.text.DecimalFormat.parse(DecimalFormat.java:2051) ~[?:1.8.0_25]
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869) ~[?:1.8.0_25]
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) ~[?:1.8.0_25]
	at java.text.DateFormat.parse(DateFormat.java:364) ~[?:1.8.0_25]
	at com.*.getSwitchDate(*.java:722) 

第二种(错误出现次数极少):multiple points

java.lang.NumberFormatException: multiple points
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[?:1.8.0_25]
	at java.lang.Long.parseLong(Long.java:601) ~[?:1.8.0_25]
	at java.lang.Long.parseLong(Long.java:631) ~[?:1.8.0_25]
	at java.text.DigitList.getLong(DigitList.java:195) ~[?:1.8.0_25]
	at java.text.DecimalFormat.parse(DecimalFormat.java:2051) ~[?:1.8.0_25]
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2162) ~[?:1.8.0_25]
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) ~[?:1.8.0_25]
	at java.text.DateFormat.parse(DateFormat.java:364) ~[?:1.8.0_25]
	at com.*.getSwitchDate(*.java:722) 

        一开始一直以为是数据库查询的空数据,然后调用 sdf.parse() 方法导致的转换异常,但是review code 发现,各种为空的场景全部判断了,不存在空数据能到722行代码的情况,就排除了这种为空场景。

        后来想到以前看到一篇文章有说过 SimpleDateFormat 是线程不安全的,而我们的使用场景涉及大量数据场景,所以使用了多线程的方案,结果问题找到了,具体异常产生可以看如下链接:

java多线程-SimpleDateFormat不安全(九)_piaoslowly的专栏-CSDN博客

        后续改进code,将如下代码放到每个调用的方法内部去使用(也就是局部变量),上线后就解决了。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

为了防止以后不好找这篇文章,特此记录下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值