FastDateFormat 对缓存的利用,其实就是用ConcurrentHashMap 作了一个map类型的缓存java
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是成员变量,能够被多个线程共享,因此存在线程安全问题