[Java] SimpleDateFormatの罠
SimpleDateFormatはスレッドセーフではない。スレッド1でformatに引数を与えて戻り値が帰ってくるまでの間に、スレッド2のformatの処理が割り込むと、スレッド1の戻り値がスレッド2の引数によるものになる。同じSimpleDateFormatのインスタンスを短時間で大量に使い回す場合は要注意。
synchronizedを使うことで解決できる。
public class SimpleDateFormatTest {
private static SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
public static void main(String[] args) {
Thread t1 = new Thread() {
@Override
public void run() {
System.out.println("thread1: " + format(new Date()));
}
};
Thread t2 = new Thread() {
@Override
public void run() {
System.out.println("thread2: " + format(new Date(new Date().getTime() - 24*60*60*1000)));
}
};
t1.start();
t2.start();
}
synchronized private static String format(Date date) { //このsynchronizedがなければ予期しない動作となる
return format.format(date);
}
}