3

私はこのプロジェクトに取り組んでいます。以下を持つクラス DefaultsHelper があります。

    public  class DefaultsHelper {

    static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd") ;

    public static String getDate(int days)
    {
        GregorianCalendar c = new GregorianCalendar() ;
        c.setTime(new Date()) ;
        c.add(Calendar.DAY_OF_MONTH, days);
        return df.format(c.getTime()) ;

    }
}

Web アプリで、getDate 関数がまったく同時に呼び出された jsp を表示している 2 人のユーザーの場合、df オブジェクトの一貫性が失われ、期待値が返されない可能性はありますか?

DefaultsHelper は、新しい df オブジェクトをインスタンス化する必要をなくすためのユーティリティ クラスであることを意図していたと思います

4

1 に答える 1

5

Calendarスレッドごとに新しいものを作成するのは良いことですが、SimpleDateFormat複数のスレッドで を使用しています。そのクラスがスレッドセーフであれば問題ありませんが、そうではありません

SimpleDateFormatスレッドセーフではないことで有名です。呼び出しごとに (つまり、メソッド内で) 新しいものを作成するか、Joda-Timeを使用してスレッドの問題を完全に回避することをお勧めします。

最適化として 1 つのフォーマッタ クラスを作成する場合、これは時期尚早の最適化と不注意な結果の典型的な例です。これが JSP 内にあるとすれば、HTTP 要求/応答時間は、新しいフォーマッターの開始時間 (およびリソース要件) よりも小さくなります。クラスをスレッドセーフで不変にし、最適化が問題になったときに心配してください。

于 2012-12-06T14:29:59.027 に答える