+1 Для тренера Regex здесь. Свободный и делает задание действительно хорошо.
Нет.
И вам это не нужно. Ваш код использует его как:
final TimeZone tz = TimeZone.getTimeZone("GMT");
......
// thread 1 SimpleDateFormat instance
sdf.setTimeZone(tz);
// thread 2 SimpleDateFormat instance
sdf.setTimeZone(tz);
У вас есть два потока, использующих один и тот же часовой пояс, но, поскольку вы не изменяете его, вам не нужно, чтобы он был потокобезопасным.
Единственное, что вы можете изменить, это идентификатор , но даже тогда все в порядке, так как остальные атрибуты доступны только для чтения
Единственный способ попасть в проблему - это изменить идентификатор и кэшировать себе часовой пояс, если вы всегда получаете его из TimeZone.getTimeZone ()
вы тоже в безопасности, потому что этот метод является потокобезопасным.
Я однажды посмотрел исходный код и пришел к выводу, что это не так.
Посмотрите на класс JodaTime timezone . В документации javadoc говорится, что это потокобезопасный и неизменяемый.
Это кажется в порядке. Если бы вы полагались на TimeZone.getDefault (), это была бы другая история. Поскольку другой поток потенциально может вызывать TimeZone.setDefault ().
Нет явной документации, в которой говорится, что TimeZone является потокобезопасным, поэтому наиболее безопасным маршрутом является предположение, что он не безопасен для потоков.
Класс TimeZone имеет два мутатора экземпляра, относящихся к ID и его смещение по Гринвичу. Здравый смысл сказал бы, что Calendar.getInstance и SimpleDateFormat не имеют никакого отношения к изменению состояния объекта TimeZone (в первом случае он используется как ключ поиска, а во втором - как контекст форматирования).
Здравый смысл или определенность - на ваш выбор.
Вы не изменяете свой часовой пояс, поэтому ваш код должен быть потокобезопасным независимо от того, является ли базовая реализация TimeZone потокобезопасной (за исключением статических методов, таких как (getTimeZone / getDefault / setDefault ).