SimpleDateFormat多线程下的异常
来源:互联网 发布:网络直播的发展历程 编辑:程序博客网 时间:2024/05/22 17:47
今天在生产上碰到一个怪异的问题,之前一直跑的很好的xml转object程序,在日期转化的过程中报错的,经过排查原因,原来是由于SimpleDateFormat在多线程下运行造成的结果。
demo例子如下:
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/***日期格式化**/public class DateFormat { private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); public Date parseDate(String str ){ if(str == null) return null; try { return SDF.parse(str); } catch (ParseException e) { e.printStackTrace(); } return null; }}public class Test { public static void main(String[] args) { for(int i=0;i<10;i++){ Thread thread = new Thread(new Runnable() { @Override public void run() { DateFormat sdf = new DateFormat(); System.out.println(sdf.parseDate("2016-10-19")); } }); thread.start(); } }}
运行错误信息:
Exception in thread "Thread-4" Exception in thread "Thread-3" java.lang.NumberFormatException: For input string: "..10011001EE22" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:430) at java.lang.Long.parseLong(Long.java:483) at java.text.DigitList.getLong(DigitList.java:194) at java.text.DecimalFormat.parse(DecimalFormat.java:1316) at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455) at java.text.DateFormat.parse(DateFormat.java:355) at com.busap.DateFormat.parseDate(DateFormat.java:14) at com.busap.Abc$1.run(Abc.java:19) at java.lang.Thread.run(Thread.java:745)Exception in thread "Thread-2" java.lang.NumberFormatException: multiple points at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110) at java.lang.Double.parseDouble(Double.java:540) at java.text.DigitList.getDouble(DigitList.java:168) at java.text.DecimalFormat.parse(DecimalFormat.java:1321) at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455) at java.text.DateFormat.parse(DateFormat.java:355) at com.busap.DateFormat.parseDate(DateFormat.java:14) at com.busap.Abc$1.run(Abc.java:19) at java.lang.Thread.run(Thread.java:745)java.lang.NumberFormatException: multiple points at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110) at java.lang.Double.parseDouble(Double.java:540) at java.text.DigitList.getDouble(DigitList.java:168) at java.text.DecimalFormat.parse(DecimalFormat.java:1321) at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455) at java.text.DateFormat.parse(DateFormat.java:355) at com.busap.DateFormat.parseDate(DateFormat.java:14) at com.busap.Abc$1.run(Abc.java:19) at java.lang.Thread.run(Thread.java:745)Exception in thread "Thread-3" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:453) at java.lang.Long.parseLong(Long.java:483) at java.text.DigitList.getLong(DigitList.java:194) at java.text.DecimalFormat.parse(DecimalFormat.java:1316) at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1793) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455) at java.text.DateFormat.parse(DateFormat.java:355) at com.busap.DateFormat.parseDate(DateFormat.java:14) at com.busap.Abc$1.run(Abc.java:13) at java.lang.Thread.run(Thread.java:745)
各种异常接踵而至,原因就是SimpleDateFormat不是线程安全类。要想解决上述问题,去掉static final 修饰符,这样每个线程生成一个SimpleDateFormat,线程之间互不影响就解决了上面的问题。不过如果在大并发的情况,就会生成一堆SimpleDateFormat类(static final 修饰符原意也是为了解决这个问题),为了优化大并发的情况,可以使用ThreadLocal。在同一个线程内共享一个SimpleDateFormat,总比多次调用生成多个的好。
0 0
- SimpleDateFormat多线程下的异常
- SimpleDateFormat 多线程环境下慎用,会报异常
- java.text.SimpleDateFormat多线程下的问题
- 多线程下调用SimpleDateFormat的问题
- 多线程下 SimpleDateFormat
- SimpleDateFormat在多线程下不安全
- 多线程下SimpleDateFormat使用出错
- 多线程下SimpleDateFormat使用出错
- 【Java 陷阱】SimpleDateFormat 时间格式化多线程异常
- SimpleDateFormat导致的多线程问题
- 高并发下的SimpleDateFormat
- Dateformat在多线程下的异常问题
- SimpleDateFormat多线程问题
- SimpleDateFormat多线程问题
- SimpleDateFormat多线程调用问题
- SimpleDateFormat的parse方法转换抛出NumberFormatException异常
- 深入理解Java:SimpleDateFormat安全的时间格式化(多线程应用)
- 使用Threadlocal来解决SimpleDateFormat的多线程安全问题
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
- MySQL mysqldump备份脚本
- gitLab迁移项目过程记录
- Markdown学习
- phpmyadmin 无法登录 MySQL 服务器
- SimpleDateFormat多线程下的异常
- Java并发编程实战笔记(5)- 线程协作
- ubuntu解决resolv.conf被重写问题
- VS2010下编译mp4v2及在项目中的使用
- SpringMVC日期类型转换问题处理总结
- 物理内存和虚拟内存
- JS 通过表单向 Action 传递元素
- 内核模式下的字符串操作
- API:RedisTemplate<K,V>