2013年2月23日土曜日

Format系オブジェクトのマルチスレッド問題

運用中のJavaのシステムが、ある日突然おかしな日付(1970年とか)を出力する、そんなトラブルに遭遇した場合は、DateFormat オブジェクトの使い方をチェックしたほうが良いかもしれません。


class DateUtil {
    static SimpleDateFormat myFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    public static String format(Date date) {
        return myFormat.format(date);
    }
}

うっかりこんなコードを書いてしまう人はかなり多いと思います。しかし、Format系のクラスはマルチスレッド対応していないため、Web系のユーザが多いシステムで利用された場合、ごくまれに誤動作を起こし、おかしな出力になったりします。しかもこの現象は、そこそこユーザが多いシステムでも年に数回だったりするので、やっかいです。この場合、Format系のクラスは毎回 new で生成してやる必要があります。


class DateUtil {
    public static String format(Date date) {
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return myFormat.format(date);
    }
}

ある意味 Java の世界では有名な JDK の不具合(?)ですが、知らない人も結構多いですね。。。

0 コメント:

コメントを投稿