SimpleDateFormat時間格式化高併發、多執行緒時出現問題
阿新 • • 發佈:2018-11-06
SimpleDateFormat是是 Java 中一個非常常用的類,該類用來對日期字串進行解析和格式化輸出,但是DateFormat 和 SimpleDateFormat 類不都是執行緒安全的,在生產環境的多執行緒或高併發情況使用 format() 和 parse() 方法,會出現很多問題:
比如格式化後的時間跟期望格式化的時間不一致,或者出現一些其他的像Exception in thread “Thread-1” java.lang.NumberFormatException: multiple points的異常錯誤,為了解決這種問題可以在需要的時候建立新例項或者使用同步鎖:
1、新建例項
public class DateUtils { //整合日期轉換 public static final DateFormat taobaoDF = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); public static final DateFormat normalDF = new SimpleDateFormat("yyyy-MM-dd"); /** * 入參日期格式轉換為系統預設的日期格式 * * @param strTaobaoDate * @return * @throws Exception */ public static String format(String strTaobaoDate) throws Exception { String strResult = ""; DateFormat normalDF = new SimpleDateFormat("yyyy-MM-dd"); DateFormat taobaoDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; try { date = taobaoDF.parse(strTaobaoDate); strResult = normalDF.format(date); } catch (Exception e) { e.printStackTrace(); throw new Exception( "日期格式不正確,日期格式如下:yyyy-MM-dd HH:mm:ss 例:2014-01-01 00:00:00"); } return strResult; } }
2、使用同步鎖
public class DateUtils { public static final DateFormat taobaoDF = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); public static final DateFormat normalDF = new SimpleDateFormat("yyyy-MM-dd"); /** * 入參日期格式轉換為系統預設的日期格式 * * @param strTaobaoDate * @return * @throws Exception */ public static String format(String strTaobaoDate) throws Exception { String strResult = ""; Date date = null; try { synchronized(taobaoDF){ date = taobaoDF.parse(strTaobaoDate); } synchronized(normalDF){ strResult = normalDF.format(date); } } catch (Exception e) { e.printStackTrace(); throw new Exception( "日期格式不正確,日期格式如下:yyyy-MM-dd HH:mm:ss 例:2014-01-01 00:00:00"); } return strResult; }
網上還有一些其它解決方案與原因說明,可以看:https://www.cnblogs.com/zhuimengdeyuanyuan/archive/2017/10/25/7728009.html