一般这种问题主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例,比如你在类似日期类中定义了一个全局的SimpleDateFormat对象,这样子肯定会出现上述的报错,比如你的代码是这样的

 1 package com.yongcheng.liuyang.utils;
 2 
 3 import java.text.ParseException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 /**
 8  *
 9  * 
10  * @author Administrator
11  *
12  */
13 public class DateUtils {
14 
15     private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
16     
17     public static Date covertDateStrToDate(String dateStr){
18         
19         try {
20             return format.parse(dateStr);
21         } catch (ParseException e) {
22             e.printStackTrace();
23         }
24         return null;
25     }
26 }

如果是上述代码,那么在多线程环境下,你可能会收到如标题所示的错误。

解决办法

1、建议在每个方法中都new一个新的SimpleDateFormat对象,这样子就可以避免这种问题。

2、也可以使用保存线程局部变量的ThreadLocal对象来保存每一个线程的SimpleDateFormat对象,小编主要说说第二种的使用,针对上述代码做的改变。

 1 package com.yongcheng.liuyang.utils;
 2 
 3 import java.text.ParseException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 /**
 8  *
 9  * 
10  * @author Administrator
11  *
12  */
13 public class DateUtils {
14 
15 private static final String format = "yyyy-MM-dd";
16     
17     //每一个线程
18     private static final ThreadLocal<SimpleDateFormat> threadLocal = new 
19             ThreadLocal<SimpleDateFormat>();
20     
21     public static Date covertDateStrToDate(String dateStr){
22         SimpleDateFormat sdf = null;
23         sdf = threadLocal.get();
24         if (sdf == null){
25             sdf = new SimpleDateFormat(format);
26         }
27         //
28         Date date = null;
29         try {
30             System.out.println("当前线程为:" + Thread.currentThread().getName());
31             date = sdf.parse(dateStr);
32         } catch (ParseException e) {
33             e.printStackTrace();
34         }
35         
36         return date;
37     }
38 }

好了,问题解决,在多线程环境下,一定要注意共享变量的线程安全问题,如无特殊必要,建议不要随便定义静态公共变量,如果非要定义,建议考虑好多线程的问题!

package com.yongcheng.liuyang.utils;
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;
/** * *  * @author Administrator * */public class DateUtils {
private static SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd”);public static Date covertDateStrToDate(String dateStr){try {return format.parse(dateStr);} catch (ParseException e) {e.printStackTrace();}return null;}}

 

版权声明:本文为ljy-20180122原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ljy-20180122/p/9520621.html