Java MessageFormatクラスはスレッドセーフですか?(SimpleDateFormatとは対照的に)
-
16-09-2020 - |
質問
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
現在のスレッドの場合。