SimpleDateFormat的线程安全问题与解决方案

今天检查线上日志的时候,发现了一个异常:

具体堆栈就不贴了。然后跟进代码去看发现了一个有意思的地方如下:

 

SimpleDateFormat 被定义成 static了。

这里会导致的问题就是, 如果 线程A 调用了 sdf.parse(), 并且进行了 calendar.clear()后还未执行calendar.getTime()的时候,线程B又调用了sdf.parse(), 这时候线程B也执行了sdf.clear()方法, 这样就导致线程A的的calendar数据被清空了(实际上A,B的同时被清空了). 又或者当 A 执行了calendar.clear() 后被挂起, 这时候B 开始调用sdf.parse()并顺利i结束, 这样 A 的 calendar内存储的的date 变成了后来B设置的calendar的date

 

解决方案:

1. 不用 static 。并发高了  耗费资源。

2. 使用 ThreadLocal private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>()。

 

具体分析 推荐:http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html

 

posted @ 2016-08-16 15:09  金海东  阅读(172)  评论(0编辑  收藏  举报