Java MessageFormatクラスはスレッドセーフですか?(SimpleDateFormatとは対照的に)

StackOverflow https://stackoverflow.com/questions/3257068

質問

SimpleDateFormatとNumberFormatはスレッドセーフではないことを知っています。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500

しかし、MessageFormatのような他のフォーマットクラスはどうですか?

Fortify360は、「MessageFormat」の使用にフラグを立てています。format(文字列、オブジェクト。..「競合状態形式の欠陥」の問題としての静的メソッドですが、MessageFormatのソースコードを分析すると、そのメソッドでMessageFormat自体の新しいローカルインスタンスが作成され

Java MessageFormatクラスはスレッドセーフですか?

役に立ちましたか?

解決

javadoc MessageFormatの場合:

メッセージフォーマットは同期されていません。 別々に作成することをお勧めします 各スレッドのインスタンスの形式。もしの場合 複数のスレッドがフォーマットにアクセスします 同時に、それは同期されなければなりません 外部的に

正式には、いいえ - それはスレッドセーフではありません。

SimpleDateFormatのドキュメントはほぼ同じことを言う。

今、ドキュメントが保守的であることができるだけで、実際にはそれは複数のスレッドでうまく機能しますが、リスクの価値はありません。

他のヒント

メソッド

に参照している場合
public static String format(String pattern, Object... arguments)
.

これは、Javadocで説明されているので、フォーマットを実行するための新しいMessageFormatを作成しているためスレッドセーフです。

BTW、あなたのタイトルの面白い字幕は 'simplethreadformat'):)

Javadocごとに, MessageFormat オブジェクトはスレッドセーフではありません。あなたが使用することができます ThreadLocal 1つを必要とするスレッドごとに個別のオブジェクトを作成します。

ThreadLocal<MessageFormat> threadLocalMessageFormat =
    new ThreadLocal<MessageFormat>() {
        @Override
        protected MessageFormat initialValue() {
            return new MessageFormat(pattern);
        }
    };

その後、次のように使用できます threadLocalMessageFormat.get() を取得するには MessageFormat 現在のスレッドの場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top