Например, вот такой код:
import java.text.*;
class MiscUtils {
public final static DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public static String formatDate(Date date) {
return fmt.format(date);
}
}
//
// usage:
//
void anyMethod() {
Date date = getDate();
String s = MiscUtils.formatDate(date);
// now we have formatted date here!
}
может вызвать проблемы, если метод MiscUtils.formatDate будет одновременно вызван из нескольких потоков.
Вот выдержка со страницы Java Docs SimpleDateFormat:
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
Решение 1.
Всякий раз, когда нужно отформатировать (или пропарсить) дату, создавать новый экземпляр java.text.SimpleDateFormat
Решение 2.
Создать свою, потокобезопасную реализацию форматтера
public class ThreadSafeSimpleDateFormat {
private DateFormat df;
public ThreadSafeSimpleDateFormat(String format) {
this.df = new SimpleDateFormat(format);
}
public synchronized String format(Date date) {
return df.format(date);
}
public synchronized Date parse(String string) throws ParseException {
return df.parse(string);
}
}
Решение 3.
Заюзать какую-нибудь стороннюю бибилиотечку наподобие JodaTime или класс FastDateFormat из Apache Commons.
А можно еще сделать реализацию с ThreadLocal
ОтветитьУдалить