- PR -

SimpleDateFormat使用の際の同期化について

投稿者投稿内容
sawat
大ベテラン
会議室デビュー日: 2006/08/02
投稿数: 112
投稿日時: 2007-06-01 09:34
インスタンスを複数スレッドで共有しなければよいだけです。
コード:
class Hoge {
  private SimpleDateFormat sdf = new SimpleDateFormat( ... );

  public void doSomething() {
    ...
    Date date = sdf.parse(str);
    ...
  }
}



のようにするのでなく、

コード:
class Hoge {
  private SimpleDateFormat newDateFormat() {
    return new SimpleDateFormat( ... );
  }
  public void doSomething() {
    ...
    Date date = newDateFormat().parse(str);
    ...
  }
}



とすればよいだけです。
同期化で問題を回避しようとするのは方向性が間違っている気がします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-06-01 10:34
一般論になりますが、パーサ系のクラスのインスタンス生成は、
他の値系のクラスのインスタンス生成に比べ比較的コストが高くなりがちで、
極力インスタンスは使いまわそうという風潮があったりします。

そこで共有すると、同期化やら色んな事を考慮しなければいけないわけですが、
結果としてインスタンス生成の方が、同期化に比べてローコストになったり、
予期しない副作用に悩まされることもあるわけで、
素直にインスタンスを都度生成するほうがよいケースもあります。
matobat
会議室デビュー日: 2002/02/27
投稿数: 3
投稿日時: 2007-06-01 10:53
SimpleDateFormatの問題はformatメソッドで受け取ったDateをインスタンス変数のcalendarにセットしているところです。そのため複数スレッドで同じインスタンスを使い回すと、別のスレッドで日付が上書きされることがあるという問題です。
同期化でも回避できますが、普通はインスタンスを作った方がコストが低いです。

そもそも親クラスのDateFormatが異なる日付でのインスタンスの使い回しを想定していないので仕方がありません。
lei2
会議室デビュー日: 2005/06/22
投稿数: 19
お住まい・勤務地: 東京都23区内
投稿日時: 2007-06-19 18:24
こんなのもありますよということで紹介。

org.apache.commons.lang.time.FastDateFormat
http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang/time/FastDateFormat.html

スキルアップ/キャリアアップ(JOB@IT)