问题
SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是由Calendar来储存的.
如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用,对这个Calendar同时操作就会导致读写不一致的情况,常见的异常有: 1.数组下标越界; 2. input为空字符串.
解决方案
private static ThreadLocal<SimpleDateFormat> yyyyMMddFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static SimpleDateFormat yyyyMMdd() {
return yyyyMMddFormat.get();
}
使用时:yyyyMMdd().parse() 或者 yyyyMMdd().format()