Java SimpleDateFormat線程安全問(wèn)題原理詳解
今天百度一些資料偶然發(fā)現(xiàn)SimpleDateFormat居然不是線程安全的,平時(shí)使用時(shí)根本沒(méi)有考慮,萬(wàn)幸今天發(fā)現(xiàn)了這個(gè)問(wèn)題,得把寫的代碼得翻出來(lái)整理一下了。
一般我們使用的SimpleDateFormat一般是這樣寫的:
public void method() { ... DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = dateFormat.parse("2020-05-10 19:53:00"); ... }
這樣寫完全沒(méi)有任何問(wèn)題,但我們有時(shí)候會(huì)覺(jué)得重復(fù)創(chuàng)建SimpleDateFormat耗費(fèi)性能,就想到把SimpleDateFormat對(duì)象做為類的靜態(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)換的時(shí)候就是這么干的,但這樣寫很有問(wèn)題,多線程通知執(zhí)行容易出問(wèn)題,要么轉(zhuǎn)換后的結(jié)果不對(duì),要么報(bào)錯(cuò),我們測(cè)試一下:
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(); } } }
測(cè)試結(jié)果如下:
那有沒(méi)有好的解決方案呢,既不用重復(fù)創(chuàng)建對(duì)象,又保證線程安全呢?答案是有。
方法一:使用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提供工具包c(diǎn)ommons-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"); ... } }
推薦使用第二種,既快有方便。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java前后端時(shí)間格式的轉(zhuǎn)化方式
- java時(shí)間格式的簡(jiǎn)單整理
- Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換詳解
- 新手小白學(xué)JAVA 日期類Date SimpleDateFormat Calendar(入門)
- java的SimpleDateFormat線程不安全的幾種解決方案
- 解決Java中SimpleDateFormat線程不安全的五種方案
- Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案
- JAVA使用SimpleDateFormat類表示時(shí)間代碼實(shí)例
- Java 時(shí)間格式轉(zhuǎn)換之impleDateFormat與Data API解析與使用
相關(guān)文章
Springboot中配置Mail和普通mail的實(shí)現(xiàn)方式
這篇文章主要介紹了Springboot中配置Mail和普通mail的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Java注解機(jī)制之Spring自動(dòng)裝配實(shí)現(xiàn)原理詳解
這篇文章主要為大家詳細(xì)介紹了Java注解機(jī)制之Spring自動(dòng)裝配實(shí)現(xiàn)原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10SpringBoot 下在 yml 中的 logging 日志配置方法
logging 配置主要用于控制應(yīng)用程序的日志輸出行為,可以通過(guò)配置定制日志的格式、級(jí)別、輸出位置等,這篇文章主要介紹了SpringBoot 下在 yml 中的 logging 日志配置,需要的朋友可以參考下2024-06-06java環(huán)境變量為什么要配置path和classpath詳細(xì)解答
為何配置path?為何配置classpath?當(dāng)時(shí)初學(xué)java時(shí)只是關(guān)心如何做而不去關(guān)心這些問(wèn)題,接下來(lái)介紹一下,感興趣的朋友可以參考下哦2013-01-01簡(jiǎn)單了解spring bean的循環(huán)引用
這篇文章主要介紹了簡(jiǎn)單了解spring bean的循環(huán)引用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Spring啟動(dòng)時(shí)實(shí)現(xiàn)初始化有哪些方式?
今天給大家?guī)?lái)的文章是關(guān)于Spring的相關(guān)知識(shí),文章圍繞著Spring啟動(dòng)時(shí)實(shí)現(xiàn)初始化有哪些方式展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說(shuō)明
這篇文章主要介紹了mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01一文解決pom.xml報(bào)錯(cuò)Dependency "xxx" not f
我們?cè)谑褂胢aven進(jìn)行jar包管理時(shí)有時(shí)會(huì)遇到pom.xml中報(bào)錯(cuò)Dependency “XXX” not found,所以在本文中將給大家介紹一下pom.xml報(bào)錯(cuò)Dependency "xxx" not found的解決方案,需要的朋友可以參考下2024-01-01