2012-05-02 7 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 1.8の)新しい 'java.time.format.DateTimeFormatter'は"不変でスレッドセーフです "。次のURLを参照してください。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のみの書式設定の前に解析もサポートされています。

関連する問題