考虑到SimpleDateFormat为线程不安全对象,故应用ThreadLocal来解决,使SimpleDateFormat从独享变量变成单个线程变量。
ThreadLocal用于处理某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。
- get()方法是用来获取ThreadLocal在当前线程中保存的变量副本;
- set()用来设置当前线程中变量的副本;
- remove()用来移除当前线程中变量的副本;
- initialValue()方法修改初始值;
package com.tanlu.user.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 考虑到SimpleDateFormat为线程不安全对象,故应用ThreadLocal来解决,
* 使SimpleDateFormat从独享变量变成单个线程变量
*/
public class ThreadLocalDateUtil {
//写法1:
/*private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
public static Date parse(String dateStr) throws ParseException {
return threadLocal.get().parse(dateStr);
}
public static String format(Date date) {
return threadLocal.get().format(date);
}*/
//写法2:
private static final String date_format = "yyyy-MM-dd HH:mm:ss";
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>();
public static DateFormat getDateFormat() {
DateFormat df = threadLocal.get();
if(df == null){
df = new SimpleDateFormat(date_format);
threadLocal.set(df);
}
return df;
}
public static String formatDate(Date date) throws ParseException {
return getDateFormat().format(date);
}
public static Date parse(String strDate) throws ParseException {
return getDateFormat().parse(strDate);
}
}