Java.text.SimpleDateFormat безопасен для потоков

Synchronization

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

Вышеупомянутая строка упоминается в классе JavaDoc класса SimpleDateFormat.

Означает ли это, что мы не должны создавать объекты SimpleDateFormat как Static.

И если мы создадим его как статичный, поэтому везде, где мы используем этот объект, нам нужно сохранить его в Synchronized Block.

Ответ 1

Да SimpleDateFormat не является потокобезопасным, и рекомендуется также, когда вы обрабатываете дату, он должен получить доступ синхронно.

public Date convertStringToDate(String dateString) throws ParseException {
    Date result;
    synchronized(df) {
        result = df.parse(dateString);
    }
    return result;
}

другой способ находится на http://code.google.com/p/safe-simple-date-format/downloads/list

Ответ 2

Это правда. Вы можете найти уже вопросы по этой проблеме в StackOverflow. Я использую для объявления как ThreadLocal:

private static final ThreadLocal<DateFormat> THREAD_LOCAL_DATEFORMAT = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyyMMdd");
    }
};

и в коде:

DateFormat df = THREAD_LOCAL_DATEFORMAT.get();

Ответ 3

Правильно. FastDateFormat от Apache Commons Lang - хорошая альтернатива потокобезопасности.

Начиная с версии 3.2 он поддерживает также синтаксический анализ до форматирования только 3.2.