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是成员变量,能够被多个线程共享,因此存在线程安全问题
相关文章
相关标签/搜索