问题
SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是由Calendar来储存的.
如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用,对这个Calendar同时操作就会导致读写不一致的情况,常见的异常有: 1.数组下标越界; 2. input为空字符串.
解决方案
使用ThreadLocal 分别为每个线程创建独立的 SimpleDateFormat ,这样就能避免共用 Calendar 引发的问题,
private static final ThreadLocal<SimpleDateFormat> dateFormatTemp = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
调用时只需用ThreadLocal 的get 方法获取独立的SimpleDateFormat 即可
dateFormatTemp.get().format(start)