1.原因
SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用, 并且, 观察 sdf.parse() 方法,你会发现有如下的调用:
@Override
public Date parse(String text, ParsePosition pos)
{
...
CalendarBuilder calb = new CalendarBuilder();
...
//calb的establish会先调用calendar的clear方法
parsedDate = calb.establish(calendar).getTime();
...
}
2.解决方法
2.1每次使用时,都创建一个新的simpledateformat实例
2.2使用同步
2.3借助threadlocal对象每个线程只创建一个实例