Вопрос проверяет понимание внутреннего состояния объектов и проблем совместного доступа.
SimpleDateFormat хранит изменяемое состояние.
При форматировании и парсинге это состояние изменяется.
При использовании из нескольких потоков возникают гонки данных.
Это приводит к некорректным результатам или исключениям.
Класс не содержит внутренней синхронизации.
Чтобы понять проблему, важно заглянуть внутрь класса.
SimpleDateFormat — это класс для форматирования и парсинга дат, использующий внутренние изменяемые поля.
SimpleDateFormat использует:
Calendar
временные буферы
промежуточные поля
Все они:
изменяются во время работы
разделяются между потоками при общем экземпляре
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Runnable task = () -> {
sdf.format(new Date());
};
При выполнении из нескольких потоков:
значения могут «перетираться»
результат форматирования становится некорректным
Варианты:
создавать новый экземпляр на поток
использовать ThreadLocal<SimpleDateFormat>
использовать DateTimeFormatter из java.time
SimpleDateFormat не потокобезопасен из-за разделяемого изменяемого состояния и отсутствия синхронизации.