由于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诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现...事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...
关于SimpleDateFormat的非线程安全问题及其解决方案.docx
NULL 博文链接:https://flynndang.iteye.com/blog/711878
主要介绍了SimpleDateFormat的线程安全问题与解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx
SimpleDateFormat线程不安全的5种解决方案.md
SimpleDateFormat线程不安全的5种解决方案.docx
主要介绍了Java SimpleDateFormat线程安全问题原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java标准库中的一些类如ArrayList、HashMap和SimpleDateFormat,都是非线程安全的,在多线程环境下直接使用它们可能导致一些非预期的结果,甚至是一些灾难性的结果。一般来说,Java标准库中的类在其API文档中会说明...
主要介绍了Java多线程环境下SimpleDateFormat类安全转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程...
这份软件安全监测报告主要是监测java开发程序中出现的安全问题,找了一个项目程序监测后出现的原版报告显示,在使用DES加解密的情况下,会被检测出这种加解密属于弱加解密,不太安全,里面有具体的安全措施建议;...
1. SimpleDateFormat 不是线程安全的 2.cache模型里面字段数据范围 3.字符串不变性 4.HashCode被设计用来提高性能
findbug的错误日志文档... 上面的英文解释其实应该说得比较清楚,在Java文档中,已经明确说明了DateFormats 是非线程安全的,而在SimpleDateFormat的Jdk 的Source文件中,我们也找到这么一段注释,说明它不是线程安全的
面向对象编程是一种先进的编程思想,更加容易解决复杂的问题。 3.多线程 Java的特点之一就是内置对多线程的支持。多线程允许同时完成多个任务。 4.安全 5.动态 1.4 java 与C/C++之关系 如果你学习过C++语言,...
如何线程安全的使用 SimpleDateFormat jdk.volatilex VolatileArrays: volatile 例子 jdk.collection.union JDK: javaAPI 方式 取得集合的交并集 (或者apache的API) largedata 大数据相关算法 目录见 larg
Collections是针对集合类的帮助类,它提供了一系列针对集合的搜索,排序,线程安全化等操作。 final、finally、finalize的区别? 答:final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承...