SimpleDateFormat的非线程安全问题 博客分类: java 基础
程序员文章站
2024-03-22 20:34:52
...
由于SimpleDateFormat不是线程安全的,因此在多线程环境下,如果共用一个SimpleDateFormat实例,会出现线程安全问题。
例如,在解析excel里的日期字段时,会报以下异常:
java.lang.NumberFormatException: For input string: ".31023102EE22"
解决的办法(一):每一个线程都new 一个SimpleDateFormat对象,而不能将SimpleDateFormat放在类的静态变量里进行实例化:
/** * 格式化日期 * @param dateString * @return */ private Date parseDate(String dateString) { Date date = null; SimpleDateFormat sdf = null; try { if(dateString.indexOf('-')>0) { sdf = new SimpleDateFormat("yyyy-MM-dd"); } else if(dateString.indexOf('/')>0) { sdf = new SimpleDateFormat("yyyy/MM/dd"); } else if(dateString.length()==8) { sdf = new SimpleDateFormat("yyyyMMdd"); } date = sdf.parse(dateString); } catch (ParseException e) { logger.error("Parse " + dateString + " error!", e); } return date; }
解决的办法(二):将SimpleDateFormat放在ThreadLocal里,然后每个线程自己获取:
//每一个线程 private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();在使用的时候,从ThreadLocal里获取,这样就能保证线程安全了。
/** * 格式化日期 * @param dateString * @return */ private Date parseDate(String dateString) { Date date = null; try { SimpleDateFormat sdf = threadLocal.get(); // SimpleDateFormat非线程安全 if (sdf == null){ if(dateString.indexOf('-')>0) { sdf = new SimpleDateFormat("yyyy-MM-dd"); } else if(dateString.indexOf('/')>0) { sdf = new SimpleDateFormat("yyyy/MM/dd"); } else if(dateString.length()==8) { sdf = new SimpleDateFormat("yyyyMMdd"); } date = sdf.parse(dateString); } } catch (ParseException e) { logger.error("Parse " + dateString + " error!", e); } return date; }
推荐阅读
-
SimpleDateFormat的非线程安全问题 博客分类: java 基础
-
Java单例模式在多线程环境中的实现 博客分类: java
-
动手开发自己的mvc-1----实现初步的控制层,实现各种配置和资源获取 博客分类: 实现自己的MVCjava综合 多线程java框架mvc
-
画图板升级 可选多种图形,颜色 博客分类: Java基础 画图板图形颜色的选择
-
用object( )方法实现非构造函数的继承 博客分类: JavaScript基础 JavaScript基础
-
用object( )方法实现非构造函数的继承 博客分类: JavaScript基础 JavaScript基础
-
Java线程中yield与join方法的区别 博客分类: Java java
-
Java开发熟手该当心的11个错误 博客分类: Java java多线程单元测试jvm
-
Java开发熟手该当心的11个错误 博客分类: Java java多线程单元测试jvm
-
多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论 博客分类: JAVA技术 多线程 同步 互斥 条件等待 信号量