一般这种问题主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例,比如你在类似日期类中定义了一个全局的SimpleDateFormat对象,这样子肯定会出现上述的报错,比如你的代码是这样的
1 packagecom.yongcheng.liuyang.utils;2
3 importjava.text.ParseException;4 importjava.text.SimpleDateFormat;5 importjava.util.Date;6
7 /**
8 *9 *10 *@authorAdministrator11 *12 */
13 public classDateUtils {14
15 private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");16
17 public staticDate covertDateStrToDate(String dateStr){18
19 try{20 returnformat.parse(dateStr);21 } catch(ParseException e) {22 e.printStackTrace();23 }24 return null;25 }26 }
如果是上述代码,那么在多线程环境下,你可能会收到如标题所示的错误。
解决办法
1、建议在每个方法中都new一个新的SimpleDateFormat对象,这样子就可以避免这种问题。
2、也可以使用保存线程局部变量的ThreadLocal对象来保存每一个线程的SimpleDateFormat对象,小编主要说说第二种的使用,针对上述代码做的改变。
1 packagecom.yongcheng.liuyang.utils;2
3 importjava.text.ParseException;4 importjava.text.SimpleDateFormat;5 importjava.util.Date;6
7 /**
8 *9 *10 *@authorAdministrator11 *12 */
13 public classDateUtils {14
15 private static final String format = "yyyy-MM-dd";16
17 //每一个线程
18 private static final ThreadLocal threadLocal = new
19 ThreadLocal();20
21 public staticDate covertDateStrToDate(String dateStr){22 SimpleDateFormat sdf = null;23 sdf =threadLocal.get();24 if (sdf == null){25 sdf = newSimpleDateFormat(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 returndate;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;}}