2012-05-02 64 views
8
Synchronization 

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally 

上面這行是在SimpleDateFormat類的JavaDoc中提到的。java.text.SimpleDateFormat不是線程安全的

是否意味着我們不應該將SimpleDateFormat對象創建爲Static。

如果我們將它創建爲靜態,那麼無論我們在何處使用此對象,都需要將它保留在同步塊中。

+2

是的你是對的 –

+2

新的'java.time.format.DateTimeFormatter'(來自Java 1.8)「是不可變的和線程安全的」。查看:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html – Linuslabo

回答

14

是的SimpleDateFormat不是線程安全的,當你分析日期應該在同步的方式訪問它,還建議。

public Date convertStringToDate(String dateString) throws ParseException { 
    Date result; 
    synchronized(df) { 
     result = df.parse(dateString); 
    } 
    return result; 
} 

另一種方式是http://code.google.com/p/safe-simple-date-format/downloads/list

21

的確如此。您可以在StackOverflow上找到關於此問題的已有問題。我用它聲明爲ThreadLocal

private static final ThreadLocal<DateFormat> THREAD_LOCAL_DATEFORMAT = new ThreadLocal<DateFormat>() { 
    protected DateFormat initialValue() { 
     return new SimpleDateFormat("yyyyMMdd"); 
    } 
}; 

,並在代碼:

DateFormat df = THREAD_LOCAL_DATEFORMAT.get(); 
9

那是正確的。來自Apache Commons Lang的FastDateFormat是一個不錯的線程安全替代方案。

從版本3.2開始,它僅支持格式化3.2之前的解析。

相關問題