怎麼進行執行緒安全的日期格式化操作?
阿新 • • 發佈:2018-11-05
由於 DateFormat
是非執行緒安全的,因此在多執行緒併發情況下日期格式化時需要特別注意。下面記錄幾種格式化的方式:
執行緒不安全的處理方式
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//執行緒不安全
這種方式會報如下異常:
執行緒安全的處理方式
方式一,每次new一個物件
public static Date parse(String date) throws ParseException { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date); }
方式二,通過ThreadLocal進行處理
private static final ThreadLocal<DateFormat> LOCAL_DATE_FORMAT = new ThreadLocal<DateFormat>(){ @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } };
如果是JDK7及以下的應用,可用ThreadLocal的方式
方式三,java8 通過 DateTimeFormatter 進行處理
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(date, DATE_TIME_FORMATTER); LOCAL_DATE_FORMAT.get().parse(date);
如果是JDK8的應用,可以使用instant代替Date,Localdatetime代替Calendar,
Datetimeformatter代替Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。