上一篇定时多线程补全任务后续处理报了标题中的异常,发现是日期转换的问题,最后定位到SimpleDateFormat是线程不安全的
解决方案:
1、使用局部变量,每次处理时new SimpleDateFormat()
2、使用同步,不推荐,对性能有影响
3、使用ThreadLocal
public class DateUtil {
private final static ThreadLocal<simpledateformat> tl = new ThreadLocal<simpledateformat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("dd/MM/yyyy");
}
};
public static Date parse(String dateStr) throws ParseException {
return threadLocal.get().parse(dateStr);
}
public static String format(Date date) {
return threadLocal.get().format(date);
}
}
4、使用第三方的日期处理函数:
4.1、使用Apache commons 里的FastDateFormat,宣称是既快又线程安全的SimpleDateFormat, 不过它只能对日期进行format, 不能对日期串进行解析。
4.2、使用Joda-Time类库来处理时间相关问题