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 的執行緒安全問題執行緒
- 03 執行緒安全問題執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- parallelStream中的執行緒安全問題Parallel執行緒
- 有個關於多執行緒的識別問題執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 模板方法中的執行緒安全問題執行緒
- lambda中stream執行緒安全的問題執行緒
- Java 執行緒安全問題的本質Java執行緒
- java基礎 關於執行緒安全Java執行緒
- 多執行緒相關問題執行緒
- 關於執行緒池的面試題執行緒面試題
- 多執行緒的安全性問題(三)執行緒
- JUC之集合中的執行緒安全問題執行緒
- SpringMVC中出現的執行緒安全問題分析SpringMVC執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- 從FMDB執行緒安全問題說起執行緒
- 多執行緒的安全問題及解決方案執行緒
- fastapi 關於執行緒池、同步、非同步的問題解答彙總ASTAPI執行緒非同步
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- 5分鐘搞懂多執行緒安全問題執行緒
- Python執行緒安全問題及解決方法Python執行緒
- 多執行緒併發安全問題詳解執行緒
- 04.關於執行緒你必須知道的8個問題(下)執行緒
- 03.關於執行緒你必須知道的8個問題(中)執行緒
- 探究Spring中Bean的執行緒安全性問題SpringBean執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- 關於Java多執行緒的執行緒同步和執行緒通訊的一些小問題(順便分享幾篇高質量的博文)Java執行緒
- 深入解讀HashMap執行緒安全性問題HashMap執行緒
- 面試中關於多執行緒同步,你必須要思考的問題面試執行緒
- 執行緒安全引起的錄音雜音電流音問題執行緒
- 單例模式中可能存在的一些問題(執行緒安全問題)單例模式執行緒
- 關於redis單執行緒的分析Redis執行緒
- 關於執行緒設計的感受執行緒
- 關於物件導向的方法並行執行的問題物件並行