采用的版本如下:
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的时候采用了自己的一套规则
分享到:
相关推荐
为了解决这个问题,我们可以使用两个方法:使用ThreadLocal或使用第三方工具包commons-lang3。 使用ThreadLocal可以确保每个线程都拥有自己的SimpleDateFormat对象,从而避免线程安全问题。例如: ```java private ...
- `ThreadUtils`(Apache Commons Lang):提供了线程操作的辅助方法,如启动线程、关闭线程、线程池管理等。 - `ExecutorService` 和 `Future`:Java 并发库中的核心接口,用于管理和控制线程执行。 6. **反射...
通过P6Spy可以方便地了解应用程序对数据库的操作细节,帮助开发者优化SQL语句性能。 ##### 2. 添加依赖 为了集成P6Spy,首先需要在项目的构建文件(如Maven的`pom.xml`)中添加P6Spy及相关依赖。例如: ```xml ...
import org.apache.commons.lang.StringUtils; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import java.text.DateFormat; import java.text...
Apache Commons Lang是Apache软件基金会的一个开源项目,它提供了一些扩展`java.lang`包功能的类,如`StringUtils`,它提供了一系列静态方法用于增强`String`类的功能。`StringBuilder`和`StringBuffer`都是用来构建...
在实际项目中,为了确保代码的可维护性和扩展性,通常会使用专门的国际化框架,如Spring Framework的`MessageSource`接口,或者Apache Commons Lang的`MessageFormat`类,它们提供更高级别的抽象和便利功能。...
4.3 StringUtils类:这可能是用于处理字符串的辅助类,通常在Apache Commons Lang库中可以找到。 4.4 StringBuilder类:StringBuilder是可变字符序列,适用于频繁修改字符串的场景。 4.5 正则表达式:正则表达式用于...
import org.apache.commons.lang.StringUtils; /** * 日付に関するユーティリティクラス * */ public class DateUtil { /** * 年月日時のフォーマット(年月日) */ public static final String YYYYMMDD =...
相比之下,StringBuilder和StringBuffer是可变的,可以用来提高字符串操作的性能。StringBuilder是非线程安全的,因此通常比线程安全的StringBuffer具有更好的性能。 8. 重复拼接同一字符串 当需要重复拼接同一字符...
3. StringUtils类:Apache Commons Lang提供的字符串操作工具类。 4. StringBuilder类:可变的字符序列,效率高于String。 5. 正则表达式:用于模式匹配和字符串操作。 6. Date类:表示特定的瞬间,精确到毫秒。 7. ...
`Apache Commons Lang`库提供了一个`LocaleUtils.toLocale(String language)`方法,但该方法并不支持最后两个字符为小写的语言代码,比如"zh_CN"是有效的,但"zh_cn"则不被接受。 为了处理这种情况,我们可以自定义...