關於時間轉換 SimpleDateFormat 的使用的問題

最近一段時間在作一個項目,項目中使用了大量的額時間格式轉換,爲了方便,就提取了一個時間操做的工具類,因爲使用過於頻繁,且處於壓力測試,每一個不到三秒,甚至毫秒級的去調用時間工具類裏的轉換方法時,從後臺服務器查到,上傳的時間偶發性的異常,就是時間居然格式不對了,居然出現了 0001-02-22 12:30:26 的狀況,我屮艸芔茻,這是什麼狀況,怎麼時間回到了古代,公元1年?java

當時,我就懷疑,是否是操做過於頻繁,線程不安全致使的?爲此,修改了調用方式。果真,效果顯著,居然壓力測試幾天,時間轉換錯誤再也不出現了。看來確實是這個狀況。當時,錯誤出現時,我用的是把 SimpleDateFormat 提取成全局變量,是 static 變量,在全局中直接先 new 好。這樣的處理方式是不行的。android

今天,我在查看阿里巴巴 Java 技術開發手冊時,居然看到了裏面也有這方面的知識,果真,大公司就是考慮周到,居然在開發手冊的併發處理中說到了 SimpleDateFormat 的使用。手冊裏是這麼說的:程序員

SimpleDateFormat 是線程不安全的類,通常不要定義爲 static 變量,若是定義爲 static,必須加鎖,或者使用 DateUtils 工具類。安全

而阿里巴巴推薦使用的方式以下:服務器

正例:注意線程安全,使用 DateUtils。亦推薦以下處理:微信

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { 
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        } 
};複製代碼

說明:若是是 JDK8 的應用,可使用 instant 代替 Date,Localdatetime 代替 Calendar, Datetimeformatter 代替 Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。併發

最後,在小密圈分享這個小知識點,但願可以對你們有所幫助,之後不會犯跟我同樣的錯誤。ide

在這裏強烈推薦你們看看阿里巴巴 Java 技術開發手冊,沒多少也就30多頁,真的可以讓大家收益頗豐。工具

歡迎你們關注個人技術分享公衆號:非著名程序員(smart_android)。技術文章均先首發於個人技術分享的微信公衆號。測試

相關文章
相關標籤/搜索