Java SimpleDateFormat線程安全問題原理詳解
今天百度一些資料偶然發(fā)現(xiàn)SimpleDateFormat居然不是線程安全的,平時使用時根本沒有考慮,萬幸今天發(fā)現(xiàn)了這個問題,得把寫的代碼得翻出來整理一下了。
一般我們使用的SimpleDateFormat一般是這樣寫的:
public void method() {
...
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dateFormat.parse("2020-05-10 19:53:00");
...
}
這樣寫完全沒有任何問題,但我們有時候會覺得重復(fù)創(chuàng)建SimpleDateFormat耗費(fèi)性能,就想到把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");
...
}
我經(jīng)常在Controller做日期轉(zhuǎn)換的時候就是這么干的,但這樣寫很有問題,多線程通知執(zhí)行容易出問題,要么轉(zhuǎn)換后的結(jié)果不對,要么報錯,我們測試一下:
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();
}
}
}
測試結(jié)果如下:

那有沒有好的解決方案呢,既不用重復(fù)創(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");
...
}
}
推薦使用第二種,既快有方便。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java前后端時間格式的轉(zhuǎn)化方式
- java時間格式的簡單整理
- Java SimpleDateFormat中英文時間格式化轉(zhuǎn)換詳解
- 新手小白學(xué)JAVA 日期類Date SimpleDateFormat Calendar(入門)
- java的SimpleDateFormat線程不安全的幾種解決方案
- 解決Java中SimpleDateFormat線程不安全的五種方案
- Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案
- JAVA使用SimpleDateFormat類表示時間代碼實例
- Java 時間格式轉(zhuǎn)換之impleDateFormat與Data API解析與使用
相關(guān)文章
spring cloud中啟動Eureka Server的方法
本篇文章主要介紹了spring cloud中啟動Eureka Server的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Java基于外觀模式實現(xiàn)美食天下食譜功能實例詳解
這篇文章主要介紹了Java基于外觀模式實現(xiàn)美食天下食譜功能,較為詳細(xì)的講述了外觀模式的概念、原理并結(jié)合實例形似詳細(xì)分析了Java基于外觀模式實現(xiàn)美食天下食譜功能的具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下2018-05-05
springboot如何解決跨域后session獲取不到sessionId不一致
這篇文章主要介紹了springboot如何解決跨域后session獲取不到sessionId不一致問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring Boot Actuator執(zhí)行器運(yùn)行原理詳解
這篇文章主要介紹了Spring Boot Actuator執(zhí)行器運(yùn)行原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題
這篇文章主要介紹了解決SpringBoot application.yaml文件配置schema 無法執(zhí)行sql問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
阿里Sentinel支持Spring Cloud Gateway的實現(xiàn)
這篇文章主要介紹了阿里Sentinel支持Spring Cloud Gateway的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
淺試仿?mapstruct實現(xiàn)微服務(wù)編排框架詳解
這篇文章主要為大家介紹了淺試仿?mapstruct實現(xiàn)微服務(wù)編排框架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

