Где использовать синхронизированное ключевое слово при использовании 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
Ashish Pancholi 16 Май 2013 в 12:19
Вы можете взглянуть на этот javacodegeeks.com/2010 / 07 /…
 – 
Marco Forberg
16 Май 2013 в 12:21
2
SimpleDateFormat в вашем случае является локальной переменной, поэтому она является потокобезопасной, поскольку является «локальной для потока». Между прочим, этот метод не обязательно должен быть synchronized.
 – 
assylias
16 Май 2013 в 12:22

1 ответ

Лучший ответ

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

Вам нужно найти трассировку стека, связанную с вашим исключением. В противном случае это просто догадки.

3
Thilo 16 Май 2013 в 12:21