Можем ли мы объявлять объекты SimpleDateFormat как статические объекты

SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM");
SimpleDateFormat fullFormat = new SimpleDateFormat("EE MMM dd, HH:mm:ss")

У меня есть несколько таких фрагментов кода, которые часто вызываются, было бы ли смысл объявлять их как переменные static?

Безопасно ли передавать потоки динамические аргументы методу format() в таких случаях?

Ответы

Ответ 1

Нет, они не являются потокобезопасными. Вместо Joda-time.

Или сделайте их обернутыми в синхронизированный метод и сделайте их потокобезопасными

Doc Говорит четко

Форматы даты не синхронизируются. Это рекомендуется создавать отдельные для каждого потока. Если несколько потоков обращаются к формату одновременно, он должен быть синхронизирован извне.

Ответ 2

Как и в случае с Java 8, это поддерживается в новом API дат. DateTimeFormatter является потокобезопасным и может выполнять ту же работу, что и SimpleDateFormat. Процитировано из JavaDoc:

Форматирующий элемент, созданный из шаблона, может использоваться столько раз, сколько необходимо, он является неизменным и является потокобезопасным.

Чтобы быть более ясным, отлично определить формат, например:

private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");

И использовать его в методах, к которым можно одновременно обращаться несколькими потоками:

String text = date.toString(formatter);
LocalDate date = LocalDate.parse(text, formatter);

Ответ 3

DateFormat не является потокобезопасным. Если несколько потоков используют один и тот же объект DateFormat без какой-либо синхронизации, вы можете получить неожиданные результаты. Поэтому вам нужно либо синхронизировать доступ к объекту DateFormat, использовать переменную ThreadLocal, либо использовать альтернативный API дат, такой как Joda-Time.

Для получения дополнительной информации о том, как это сделать, взгляните на это сообщение в блоге: DateFormat с несколькими потоками

Ответ 5

static не должно быть проблемой.

Поскольку AFAIK не дает никаких гарантий в отношении безопасности потоков, вам нужно будет проверить исходный код для этого. И даже если вы придете к выводу, что это потокобезопасность, это может измениться со следующей версией. Как сказано в другом ответе, они не являются потокобезопасными.

Вы действительно выделяете такое огромное количество потоков, которые дают каждому потоку собственный формат - проблема?