SimpleDateFormat 为静态对象,都多个线程同时解析调用parse方法时 parse()调用情况:
1)先调用DateFormat对象的public Date parse(String source) throws ParseException
2)DateFormat对象的parse方法调用SimpleDateFormat对象的public Date parse(String text, ParsePosition pos)
3)SimpleDateFormat对象的parse方法调用 CalendarBuilder 对象的 Calendar establish(Calendar cal)
4)在 establish()中,做了cal.clear();把calendar清空且没有设置新值。如果此时线程A将calendar清空且没有设置新值,线程B也进入parse方法用到了SimpleDateFormat对象中的calendar对象,此时就会产生线程安全问题!
public class SimpleDateFormatDemo {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static Date parse(String strDate) throws ParseException {
return sdf.parse(strDate);
}
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(100);
for (int i = 0; i < 20; i++) {
service.execute(() -> {
for (int j = 0; j < 10; j++) {
try {
System.out.println(parse("2021-05-02 23:58:36"));
} catch (ParseException e) {
e.printStackTrace();
}
}
});
}
//等待上述的线程执行完
service.shutdown();
service.awaitTermination(1, TimeUnit.DAYS);
}
}