Можем ли мы объявлять объекты 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 с несколькими потоками
Ответ 4
Альтернатива, если вы уже используете Apache Commons:
https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/FastDateFormat.html
Ответ 5
static не должно быть проблемой.
Поскольку AFAIK не дает никаких гарантий в отношении безопасности потоков, вам нужно будет проверить исходный код для этого. И даже если вы придете к выводу, что это потокобезопасность, это может измениться со следующей версией. Как сказано в другом ответе, они не являются потокобезопасными.
Вы действительно выделяете такое огромное количество потоков, которые дают каждому потоку собственный формат - проблема?