Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

среда, 31 августа 2011 г.

java.text.SimpleDateFormat и потоки

Использование класса java.text.SimpleDateFormat, не является потокобезопасным.

Например, вот такой код:


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.

1 комментарий:

Постоянные читатели