2

SimpleDateFormat私はいくつかのJava日付パターンを持っており、速度を上げるために、静的参照を介して、異なるスレッドのオブジェクトでそれらを複数回再利用したいと考えています。

コードは次のようになります(たとえば、と呼ばれるクラス内FormatClass):

private static String[] PATTERNS = new String[] {...};

public ThreadLocal<SimpleDateFormat[]> LOCAL_FORMATS = new ThreadLocal<SimpleDateFormat[]>
{
    @Override
    protected SimpleDateFormat[] initialValue()
    {
        List<SimpleDateFormat> formatList = new ArrayList<SimpleDateFormat>();

        for (String pattern:PATTERNS)
        {
            formatList.add(new SimpleDateFormat(pattern);
        }

        return formatList.toArray(new SimpleDateFormat[0]);
    }
}

上記のコードを使用すると、別のクラスのメソッドは、次のように複数の日付文字列を作成できますformat(または)。parse

public static void printFormatted(String date)
{
    for (SimpleDateFormat sdf:FormatClass.LOCAL_FORMATS.get())
    {
        System.out.println(sdf.format(date));
    }
}

ここで、printFormatted()メソッドは静的である場合とそうでない場合がありますが、複数の異なるスレッドによって確実にアクセスされます。

上記のアプローチは期待どおりに機能しますか?

4

4 に答える 4

3

あなたの質問に正直に答えるために:はい、SimpleDateFormatのドキュメントで推奨されているように、すべてのスレッドには独自のコピーがあります。

于 2012-05-08T01:15:00.233 に答える
0

まだ誰も提案していない、より洗練されたアプローチがあると思います。メソッドへのアクセスを同期する SimpleDateFormat のドロップイン置換ラッパー クラスを作成するだけです。ほとんどの場合、同期のオーバーヘッドは ThreadLocalMap のハッシュ ルックアップよりも悪くないと私は主張します。

于 2013-12-09T17:54:08.880 に答える