对DateFormat的操作之commons-lang

采用的版本如下:

commons-lang-2.5.jar

基于commons-lang进行date format的操作代码如下:

		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		String pattern = "yyyy-MM-dd hh:mm:ss";
		String dateStr = DateFormatUtils.format(calendar, pattern);
		Date date = DateUtils.parseDate(dateStr, new String[] {pattern });
		LOGGER.info("dateStr:" + dateStr);
		LOGGER.info("date:" + date);

 考察 DateFormatUtils.format和DateUtils.parseDate是否线程安全的

通过调用FastDateFormat获取format

    public static String format(Calendar calendar, String pattern, TimeZone timeZone, Locale locale)
    {
        FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
        return df.format(calendar);
    }

 同步调用getInstance获取实例

    public static synchronized FastDateFormat getInstance(String pattern, TimeZone timeZone, Locale locale)
    {
        FastDateFormat emptyFormat = new FastDateFormat(pattern, timeZone, locale);
        FastDateFormat format = (FastDateFormat)cInstanceCache.get(emptyFormat);
        if(format == null)
        {
            format = emptyFormat;
            format.init();
            cInstanceCache.put(format, format);
        }
        return format;
    }

 我们发现如果pattern相同那么获取到的FastDateFormat就一定是相同的,那我们就开始问了,是否他是线程安全的呢?是否线程安全取决于如下信息:

1.static的变量是否都是final的
2.static的变量不是final的时候是否会被修改?

 查看源码:

    private static final long serialVersionUID = 1L;
    public static final int FULL = 0;
    public static final int LONG = 1;
    public static final int MEDIUM = 2;
    public static final int SHORT = 3;
    private static String cDefaultPattern;
    private static final Map cInstanceCache = new HashMap(7);
    private static final Map cDateInstanceCache = new HashMap(7);
    private static final Map cTimeInstanceCache = new HashMap(7);
    private static final Map cDateTimeInstanceCache = new HashMap(7);
    private static final Map cTimeZoneDisplayCache = new HashMap(7);
    private final String mPattern;
    private final TimeZone mTimeZone;
    private final boolean mTimeZoneForced;
    private final Locale mLocale;
    private final boolean mLocaleForced;
    private transient Rule mRules[];
    private transient int mMaxLengthEstimate;

 我们发现符合线程安全条件,因此他是线程安全的,只不过解析date的时候采用了自己的一套规则

猜你喜欢

转载自snv.iteye.com/blog/1767523