Можем ли мы объявить объекты SimpleDateFormat статическими - PullRequest
18 голосов
/ 26 мая 2011
SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM");
SimpleDateFormat fullFormat = new SimpleDateFormat("EE MMM dd, HH:mm:ss")

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

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

Ответы [ 5 ]

28 голосов
/ 26 мая 2011

Нет они не являются потокобезопасными. Вместо этого используйте версию Joda-time .

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

Документ Четко сказано

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

15 голосов
/ 07 мая 2015

Начиная с 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);
2 голосов
/ 26 мая 2011

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

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

1 голос
/ 20 января 2015

Альтернатива, если вы уже используете Apache Commons:

https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/FastDateFormat.html

0 голосов
/ 26 мая 2011

статика не должна быть проблемой.

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

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

...