3 回答
TA贡献1874条经验 获得超12个赞
我看了一下parse()源代码的注释,有一段是这位的
This parsing operation uses the {@link DateFormat#calendar
calendar} to produce a {@code Date}. All of the {@code
calendar}'s date-time fields are {@linkplain Calendar#clear()
cleared} before parsing, and the {@code calendar}'s default
values of the date-time fields are used for any missing
date-time information.
大概意思就是parse()方法使用calendar来生成返回的Date实例,问题是这里它用到的calendar不是每次方法执行时都新生成一个,它是定义了一个"protected Calendar calendar"属性,按注释的意思,每次parse之前,都会把calendar里的相关属性都清除,然后用新的处理结果填充此对象,这样的话在多线程里边,parse()执行过程中,就会出现一个线程刚把calendar设置好之后,另一个线程把它给清空了,因为都是一个sdf实例,其他问题原因应该都是这个
TA贡献1785条经验 获得超8个赞
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// Convert input date to time field list
calendar.setTime(date);
boolean useDateFormatSymbols = useDateFormatSymbols();
...
}
这里使用的calendar是类成员,多线程去setTime会有线程安全问题
添加回答
举报