9
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 に記載されています。

SimpleDateFormat オブジェクトを Static として作成してはならないということですか。

そして、それを静的として作成する場合、このオブジェクトを使用する場所はどこでも、同期ブロックに保持する必要があります。

4

3 に答える 3

24

それは本当だ。この問題に関する質問は、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();
于 2012-05-02T10:34:27.380 に答える
16

はい、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にあります

于 2012-05-02T10:38:10.793 に答える
9

そのとおりです。Apache Commons Lang のFastDateFormatは、優れたスレッドセーフな代替手段です。

バージョン 3.2 以降は解析もサポートしていますが、3.2 より前はフォーマットのみです。

于 2012-05-02T10:38:29.420 に答える