9

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

しかし、MessageFormatのような他のFormatクラスはどうですか?

Fortify 360は、「MessageFormat.format(String、Object ...)」静的メソッドの使用を「競合状態-フォーマットの欠陥」の問題としてフラグ付けしていますが、MessageFormatのソースコードを分析すると、そのメソッドでそれがわかりました。 、MessageFormat自体の新しいローカルインスタンスを作成します。

Java MessageFormatクラスのスレッドは安全ですか?

4

3 に答える 3

11

javadocは次のようにMessageFormat述べています。

メッセージ形式は同期されません。スレッドごとに個別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドが同時にフォーマットにアクセスする場合は、外部で同期する必要があります。

したがって、公式には、いいえ-スレッドセーフではありません。

のドキュメントSimpleDateFormatはほとんど同じことを言っています。

さて、ドキュメント保守的である可能性があり、実際には複数のスレッドで問題なく機能しますが、リスクを冒す価値はありません。

于 2010-07-15T15:28:15.953 に答える
8

メソッドを参照している場合

public static String format(String pattern, Object... arguments)

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

ところで、それはあなたのタイトルの面白いタイプミスです'SimpleThreadFormat' :)

于 2010-07-15T15:48:52.940 に答える
0

javadocによると、MessageFormatオブジェクトはスレッドセーフではありません。を使用しThreadLocalて、オブジェクトを必要とするスレッドごとに個別のオブジェクトを作成できます。

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

次に、を使用して現在のスレッドのthreadLocalMessageFormat.get()を取得できます。MessageFormat

于 2018-03-07T22:38:14.377 に答える