FastDateFormat 对缓存的利用,其实就是用ConcurrentHashMap 做了一个map类型的缓存
public F getInstance(final String pattern, TimeZone timeZone, Locale locale) {
Validate.notNull(pattern, "pattern must not be null");
if (timeZone == null) {
timeZone = TimeZone.getDefault();
}
if (locale == null) {
locale = Locale.getDefault();
}
final MultipartKey key = new MultipartKey(pattern, timeZone, locale);
F format = cInstanceCache.get(key);
if (format == null) {
format = createInstance(pattern, timeZone, locale);
final F previousValue= cInstanceCache.putIfAbsent(key, format);
if (previousValue != null) {
// another thread snuck in and did the same work
// we should return the instance that is in ConcurrentMap
format= previousValue;
}
}
return format;
}
线程安全的理解
FastDateFormat#format
public String format(final Date date) {
return printer.format(date);
}
FastDatePrinter#format,可以看到底层用的是Calendar
因为是在方法体内定义了了Calendar,而方法体内的局部变量是属于栈的
而栈是线程独享的,不存在线程安全问题
public String format(final Date date) {
final Calendar c = newCalendar();
c.setTime(date);
return applyRulesToString(c);
}
而SimpleDateFormat 用到的Calendar是成员变量,可以被多个线程共享,所以存在线程安全问题