技術開発日記

技術やら日々思ったことを綴ってます。

SimpleDateFormatとマルチスレッド

SimpleDateFormatは基本的には以下の様にクラス変数として宣言するものと思っていた。
毎回newするのも微妙だと思って。

private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

public void func () {
}

ただ、このように実装してしまうとマルチスレッドの環境では正常に動作せず、バグの温床となるらしい。
そこで対応策として、SimpleDateFormatを使用する際はクラス変数にせず、毎回newするようにするのがベストとのこと。

public void func () {
    Calendar date = new GregorianCalendar();  
    date.add(GregorianCalendar.DATE, d);  
  
    // インスタンスを毎回作成する  
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
    String text = format.format(date.getTime());  
}


関連記事
http://symple.jp/20.html