J2SE - 關於SimpleDateFonnat的執行緒安全問題
一、問題
負責日期轉換和格式化的SimpleDateFonnat類,在多執行緒的環境中,很容易出現各種問題,比如轉換的時間不正確、執行緒被掛死、丟擲NumberFormatException異常等,因為該類並不是執行緒安全的
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:601)
at java.lang.Long.parseLong(Long.java:631)
at java.text.DigitList.getLong(DigitList.java:195)
at java.text.DecimalFormat.parse(DecimalFormat.java:2051)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
at java.text.DateFormat.parse(DateFormat.java:364)
at DateFormatTest.run(DateFormatTest.java:24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
二、方案
1、區域性變數
高併發的情況下會大量的建立和銷燬,非常耗費資源
public String format(Date date){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return dateFormat.format(date);
}
2、同步方法/塊每次執行時都會加鎖,高併發時對效能產生很大影響
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String formatDate(Date date)throws ParseException{
synchronized(DATE_FORMAT){
return DATE_FORMAT.format(date);
}
}
3、ThreadLocal為每個執行緒建立一個Format物件,執行緒只使用自己的
private static ThreadLocal<DateFormat> LOCAL_DATE_FORMAT = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
public static Date parse(String dateStr) throws ParseException {
return LOCAL_DATE_FORMAT.get().parse(dateStr);
}
4、第三方工具比如 Joda-Time 類庫,或者 Apache的 commons-lang 包中的 DateFormatUtils 與 FastDateFormat 工具類
5、JDK8關於Date和Time的新API
相關文章
- 關於執行緒的問題...執行緒
- 關於js執行緒問題的解讀JS執行緒
- ArrayList 的執行緒安全問題執行緒
- 小小問題―關於java多執行緒Java執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- java執行緒安全問題Java執行緒
- 請教一個關於執行緒的問題執行緒
- 關於執行緒的問題,清高手指點執行緒
- parallelStream中的執行緒安全問題Parallel執行緒
- 所謂的執行緒安全問題執行緒
- 關於多執行緒訪問靜態方法的問題執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 有個關於多執行緒的識別問題執行緒
- 關於線上檢測主執行緒卡頓的問題執行緒
- 關於執行緒插入函式如何用的問題執行緒函式
- 請教關於執行緒的結束問題,急!!!執行緒
- 關於執行緒池的面試題執行緒面試題
- 多執行緒-執行緒安全問題的產生原因分析以及同步程式碼塊的方式解決執行緒安全問題執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- java基礎 關於執行緒安全Java執行緒
- 關於java執行緒釋放資源問題Java執行緒
- lambda中stream執行緒安全的問題執行緒
- Java 執行緒安全問題的本質Java執行緒
- 模板方法中的執行緒安全問題執行緒
- 多執行緒非同步安全,安全鎖的問題執行緒非同步
- 多執行緒相關問題執行緒
- 請教大俠。關於多執行緒同步問題執行緒
- JUC之集合中的執行緒安全問題執行緒
- 多執行緒的安全性問題(三)執行緒
- 求助!關於執行緒的問題?各位大俠謝謝了!!!執行緒
- 求助!關於多執行緒連線資料庫的問題執行緒資料庫
- 關於JSP 例項方法的執行緒安全JS執行緒
- 關於多執行緒協作的疑問執行緒
- 從FMDB執行緒安全問題說起執行緒
- 執行緒問題執行緒
- 多執行緒的安全問題及解決方案執行緒
- SpringMVC中出現的執行緒安全問題分析SpringMVC執行緒