大致意思:Tim Cull 碰到一个 SimpleDateFormat 带来的严重的性能问题,该问题主要有 SimpleDateFormat 引发,创建一个 SimpleDateFormat 实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。即使将 SimpleDateFormat 定义为静态类变量,貌似能解决这个问题,但是 SimpleDateFormat 是非线程安全的,同样存在问题,如果用 ‘synchronized’线程同步同样面临问题,同步导致性能下降(线程之间序列化的获取 SimpleDateFormat 实例)。
Tim Cull 使用 Threadlocal 解决了此问题,对于每个线程 SimpleDateFormat 不存在影响他们之间协作的状态,为每个线程创建一个 SimpleDateFormat 变量的拷贝或者叫做副本,代码如下:
[java] view plain copy
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 使用ThreadLocal以空间换时间解决SimpleDateFormat线程安全问题。
*
* @author
*
*/
public class DateUtil {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@SuppressWarnings("rawtypes")
private static ThreadLocal threadLocal = new ThreadLocal() {
protected synchronized Object initialValue() {
return new SimpleDateFormat(DATE_FORMAT);
}
};
public static DateFormat getDateFormat() {
return (DateFormat) threadLocal.get();
}
public static Date parse(String textDate) throws ParseException {
return getDateFormat().parse(textDate);
}
}
创建一个 ThreadLocal 类变量,这里创建时用了一个匿名类,覆盖了 initialValue 方法,主要作用是创建时初始化实例。也可以采用下面方式创建;
[java] view plain copy
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/**
* 使用ThreadLocal以空间换时间解决SimpleDateFormat线程安全问题。
*
* @author
*
*/
public class DateUtil {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
// 第一次调用get将返回null
private static ThreadLocal threadLocal = new ThreadLocal();
// 获取线程的变量副本,如果不覆盖initialValue,第一次get返回null,故需要初始化一个SimpleDateFormat,并set到threadLocal中
public static DateFormat getDateFormat() {
DateFormat df = (DateFormat) threadLocal.get();
if (df == null) {
df = new SimpleDateFormat(DATE_FORMAT);
threadLocal.set(df);
}
return df;
}
}
我们看下我们覆盖的 initialValue 方法:
[java] view plain copy
protected T initialValue() {
return null;//直接返回null
}
当然也可以使用:
apache commons-lang 包的 DateFormatUtils 或者 FastDateFormat 实现,apache 保证是线程安全的,并且更高效。
ThreadLocal 参考:http://blog.csdn.net/partner4java/article/details/7107217
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于