Где использовать синхронизированное ключевое слово при использовании DateFormat в многопоточной среде?
Я получаю ниже Exception
:
java.lang.ArrayIndexOutOfBoundsException: -1
Когда я заглянул в свой код, у меня есть метод, который форматирует дату с помощью SimpleDateFormat
.
public static synchronized String now(String dateFormat) {
if (dateFormat.equalsIgnoreCase("")) {
dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
}
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = null;
if (dateFormat == null || dateFormat.equalsIgnoreCase("")) {
sdf = new SimpleDateFormat();
} else {
sdf = new SimpleDateFormat(dateFormat, Locale.getDefault());
}
return sdf.format(cal.getTime());
}
Хотя мне не удалось воспроизвести исключение, это, вероятно, место, где я мог столкнуться с java.lang.ArrayIndexOutOfBoundsException
, потому что я нашел ссылка, описывающая, как использовать DateFormat
в многопоточной среде. DateFormat
не синхронизируются, поэтому при работе в многопоточной среде он может выдать java.lang.ArrayIndexOutOfBoundsException
.
Но мой вышеупомянутый метод уже является методом synchronized
.
У меня вопрос:
Может ли статический метод быть методом synchronized
?
Нужно ли мне синхронизировать объект SimpleDateFormat
вместо метода synchronized
и почему?
1 ответ
Показанный выше метод не имеет доступа к общему состоянию (DateFormat создается как локальная переменная), поэтому вам не нужно синхронизировать его вообще .
Вам нужно найти трассировку стека, связанную с вашим исключением. В противном случае это просто догадки.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
SimpleDateFormat
в вашем случае является локальной переменной, поэтому она является потокобезопасной, поскольку является «локальной для потока». Между прочим, этот метод не обязательно должен бытьsynchronized
.