• ベストアンサー

SimpleDateFormatについて

SimpleDateFormatについて質問があります。 FindBugsというツールを使って、 プログラムをチェックしてみたら、 『SimpleDateFormatはスレッドセーフではありません。』 という警告が出ました。 その警告が出ている箇所は、 以下のようになっています。 public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/mm/dd"); 定数DATE_FORMATは他のクラスで使われていなかったので、 publicをprivateに変えてから、 再度FindBugsでチェックしてみたら、警告は消えていました。 それだけで、スレッドセーフになるんでしょうか? 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 こんにちは。 >applyPatternで上書きできるから、 >よろしく無いのであれば、上書きさえしてなければ、 >SimpleDateFormatのインスタンスはスレッドセーフである >という認識でよろしいでしょうか?  スレッドセーフではないみたいです。  一番よく使う formatメソッド、parseメソッドともども、メソッド内で calendar と言うインスタンス変数に値を設定しています。  この時点でアウトです。

k_u_m_a_
質問者

お礼

回答ありがとうございます。 使っているのはformat、parseメソッドなので、 複数スレッドで使いまわすとアウトという事ですね。 参考になりました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • qbr2
  • ベストアンサー率50% (62/123)
回答No.5

>privateにしたことで警告が消えるのは >インスタンスが他のスレッドの影響を受けなくなったため >スレッドセーフな実装になった 別スレッドでインスタンスを生成した場合って、 staticな部分は共有されるんじゃなかったでしたっけ?

すると、全ての回答が全文表示されます。
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

> 上書きさえしてなければ 「スレッドセーフ」の意味がわかっていないわね。 あるスレッドでの変更が 他のスレッドに影響してしまう という特徴がスレッドセーフではないと言うのよ。 そのスレッドのみにしか影響しない というのがスレッドセーフであるってことよ。 privateにしたことで警告が消えるのは インスタンスが他のスレッドの影響を受けなくなったため スレッドセーフな実装になったと チェックツールが判断してたのよ。

k_u_m_a_
質問者

お礼

回答ありがとうございます。 スレッドセーフについて 理解しているつもりでしたが、 もうちょっと勉強してみます。 参考になりました。

すると、全ての回答が全文表示されます。
  • qbr2
  • ベストアンサー率50% (62/123)
回答No.2

厳密にはprivate staticでも、スレッドセーフではないんですが、 privateであれば、そのクラスの挙動 (クラス内でSimpleDateFormatでどう使われているか?)だけに 依存するようになるので、警告として上げてこないんじゃないかと。

k_u_m_a_
質問者

お礼

回答ありがとうございます。 >厳密にはprivate staticでも、スレッドセーフではない そうですよね。 privateにするだけでは、 スレッドセーフにならないですよね。 おっしゃるように、ただ警告として上げて きてないだけなのかもしれません。 参考になりました。

すると、全ての回答が全文表示されます。
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

SimpleDateFormatのインスタンスをfinalにしても applyPatternでパターンを上書きできるのよ。 そうしたらその後、このインスタンスを使ったformat&parseは 今までと違う結果を返してしまうことになるでしょ? だからpublicにして複数のプログラムから アクセスさせてはダメなわけ。

k_u_m_a_
質問者

お礼

回答ありがとうございます。 applyPatternで上書きできるから、 よろしく無いのであれば、上書きさえしてなければ、 SimpleDateFormatのインスタンスはスレッドセーフである という認識でよろしいでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A