1.
public class SimpleDateFormatTest {
private static final String SIMPLE_DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss.sss";
// =================================线程不安全======================================================
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat(SIMPLE_DATE_FORMAT_PATTERN);
public static String formatDate(Date date) throws ParseException {
return SIMPLE_DATE_FORMAT.format(date);
}
public static Date parse(String strDate) throws ParseException {
return SIMPLE_DATE_FORMAT.parse(strDate);
}
// =======================================================================================
// -------------------------------------------线程安全--------------------------------------------------------
private static ThreadLocal<DateFormat> THREAD_LOCAL_DATEFORMAT = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat(SIMPLE_DATE_FORMAT_PATTERN);
}
};
public static String getFormatDate(Date date) {
return THREAD_LOCAL_DATEFORMAT.get().format(date);
}
public static Date getFormatDate(String date) throws ParseException {
return THREAD_LOCAL_DATEFORMAT.get().parse(date);
}
// ---------------------------------------------------------------------------------------------------
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new SimpleDateFormatThread()).start();
}
}
public static class SimpleDateFormatThread implements Runnable {
@Override
public void run() {
try {
String date = "1970-01-01 08:00:00.000";
String dateFormat = "";
while (true) {
// 线程不安全
dateFormat = formatDate(parse(date));
// 线程安全
// dateFormat = getFormatDate(getFormatDate(date));
if (!date.equals(dateFormat)) {
System.err.println(dateFormat);
} else {
System.out.println(dateFormat);
}
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.
3.