[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10822] Re: DecimalFormat とか もスレッドセーフではない?



村山@netgeneです.
#村山@ダイヤルアップの方がいいかな?(^^;
#相変わらず貧乏くさいアナクロ野郎です.

> 先日の読書会で、
> SimpleDataFormat#parse()/format()がスレッドセーフではない
> ということを聞きました(第2回ネタですが)。

> で、その他のjava.textのフォーマットクラスはどうなのでしょう?
> #DecimalFormatもスレッドセーフではない?

ちょっとマニュアルを見た限り他も同様のようです.

----------------------
java.text.DecimalFormat

同期

decimal フォーマットは同期化されません。スレッドごとに別の
フォーマットインスタンスを作成することをお勧めします。複数の
スレッドがフォーマットに同時にアクセスする場合は、外部的に
同期化する必要があります。
-----------
java.text.MessageFormat

同期

メッセージフォーマットは同期化されません。スレッドごとに別の
フォーマットインスタンスを作成することをお勧めします。複数の
スレッドがフォーマットに同時にアクセスする場合は、外部的に
同期化する必要があります。 
----------------------
いずれにせよ,「同期」で検索かければ分かるはずです.

ちなみに,以前もこのMLでネタにしたことがあると思いますが,
一般論としてマルチスレッド環境下では,いわゆるスレッド
セーフなクラスは使い物にならない場合がほとんどです.

「不変オブジェクト」のような一部の例外を除くほとんどの
場合において

  「スレッドセーフ = 厳重注意/原則として使用不可」

と考えておいた方が無難です.
その最たる物がVector/Hashtableですね.

> 解決策として、以下のような対処があるようでした。
> ・synchronizedやThreadLocalを使う
> ・独自のDataFormatやその他のクラス(commons.langの
> FastDateFormatなど)を使う

上でも述べられているように,
  「各スレッドごとにフォーマットインスタンスを作る」
が一番素直なんでしょう.組込み分野ででもなければインスタンス
一個のサイズなんて微々たるものです.同期にかかるコストや
リスクはこれとは比べ物になりません.


-- 
村山敏清 株式会社ネットジーン 〒164-0001 
東京都中野区中野3-33-3 インツ中野ビル 5F
E-mail:murayama@xxxxxxxxxxxxx 
TEL:(03)5328-3670 FAX:(03)5328-3673
http://www.netgene.co.jp/