Java SimpleDateFormat線程安全問題原理詳解
今天百度一些資料偶然發(fā)現SimpleDateFormat居然不是線程安全的,平時使用時根本沒有考慮,萬幸今天發(fā)現了這個問題,得把寫的代碼得翻出來整理一下了。
一般我們使用的SimpleDateFormat一般是這樣寫的:
public void method() {
...
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dateFormat.parse("2020-05-10 19:53:00");
...
}
這樣寫完全沒有任何問題,但我們有時候會覺得重復創(chuàng)建SimpleDateFormat耗費性能,就想到把SimpleDateFormat對象做為類的靜態(tài)成員變量,那么代碼就是這樣了:
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void method() {
...
Date date = dateFormat.parse("2020-05-10 19:53:00");
...
}
我經常在Controller做日期轉換的時候就是這么干的,但這樣寫很有問題,多線程通知執(zhí)行容易出問題,要么轉換后的結果不對,要么報錯,我們測試一下:
public class DateUtils {
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static Date prase(String date) throws ParseException {
return dateFormat.parse(date);
}
static class Job extends Thread {
@Override
public void run() {
try {
System.out.println(this.getName() + ":" + DateUtils.prase("2020-05-10 19:53:00"));
} catch (ParseException e) {
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Job().start();
}
}
}
測試結果如下:

那有沒有好的解決方案呢,既不用重復創(chuàng)建對象,又保證線程安全呢?答案是有。
方法一:使用ThreadLocal
public class MyController {
private static ThreadLocal<DateFormat> local = new ThreadLocal<DateFormat>() {
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
};
};
public void method() {
...
Date date = local.get().parse("2020-05-10 19:53:00");
...
}
}
方法二:使用第三方apache提供工具包commons-lang3
import org.apache.commons.lang3.time.FastDateFormat;
public class MyController {
public void method() {
...
Date date = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss").parse("2020-05-10 19:53:00");
...
}
}
推薦使用第二種,既快有方便。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot 下在 yml 中的 logging 日志配置方法
logging 配置主要用于控制應用程序的日志輸出行為,可以通過配置定制日志的格式、級別、輸出位置等,這篇文章主要介紹了SpringBoot 下在 yml 中的 logging 日志配置,需要的朋友可以參考下2024-06-06
java環(huán)境變量為什么要配置path和classpath詳細解答
為何配置path?為何配置classpath?當時初學java時只是關心如何做而不去關心這些問題,接下來介紹一下,感興趣的朋友可以參考下哦2013-01-01
一文解決pom.xml報錯Dependency "xxx" not f
我們在使用maven進行jar包管理時有時會遇到pom.xml中報錯Dependency “XXX” not found,所以在本文中將給大家介紹一下pom.xml報錯Dependency "xxx" not found的解決方案,需要的朋友可以參考下2024-01-01

