2012-05-08 4 views
2

Javaの日付パターンが多数あり、速度のために静的参照を使用して異なるスレッド間でSimpleDateFormatオブジェクトに何度も再利用したいと考えています。SimpleDateFormatへのマルチスレッドアクセスのThreadLocal

コードは、この(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)上のメソッドの複数の日付文字列を:printFormatted()方法は、または静的であってもなくてもよいが、明確に異なる複数のスレッドによってアクセスされる

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

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

+1

'toArray'メソッドを使うときは、[' new SimpleDateFormat [list.size()] ']を使う方が効率的です(http://stackoverflow.com/questions/174093/toarraynew-myclass0-or- toarraynew-myclassmylist-size)である。 – Jeffrey

+0

いいえ、toArray()メソッドのソースコードを見ると、まったく同じです。 – PNS

+1

私があなたに与えたリンクを読んでください。まったく同じではありません。最初はリスト全体を格納するのに十分な大きさの配列を指定すると、その配列が使用されます。そうしないと、まったく新しい配列を割り当てて正しい型にキャストする必要があります。 – Jeffrey

答えて

3

あなたの質問にまっすぐ答えます:はい、すべてのスレッドは、SimpleDateFormatのドキュメントで推奨されるように、独自の一意のコピーを持ちます。

+0

私が投稿したコードはそれを達成することを意味します、はい?私は、ドキュメント、したがってThreadLocalの使用を認識しています。 – PNS

+0

はい、このコードでは、すべてのスレッドがSimpleDateFormatを安全に使用できるようになります。なぜなら、要求するすべてのスレッドに対してSimpleDateFormatの一意の配列が存在するからです。スレッドが多い場合は注意してください。 – Moinonime

1

これはかなりうまく見えますが、マルチスレッドプログラムで簡単にテストできます。スレッド(Thread.currentThread().toString())とSystem.identifyHashCode(simpleDateFormat)のIDを印刷して、スレッドごとに一意のコピーを取得し、それらを適切に再利用していることを確認してください。

0

これはうまくいきますが、コードは比較的複雑です。 SimpleDateFormatをメソッド内のローカル変数(常にスレッドローカル)に割り当てることができるかどうかをチェックすることを提案します。これは、多くの値がループ内でフォーマットされ、同じメソッド内にある場合にうまく機能します。

0

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

関連する問題