FastDateFormat 研究

 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是成員變量,能夠被多個線程共享,因此存在線程安全問題
相關文章
相關標籤/搜索