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是成員變量,能夠被多個線程共享,因此存在線程安全問題