采用的版本如下:
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的时候采用了自己的一套规则