Действительно ли TimeZone Java ориентирован на многопотоковое исполнение?

+1 Для тренера Regex здесь. Свободный и делает задание действительно хорошо.

http://www.weitz.de/regex-coach/

16
задан His 12 November 2009 в 23:38
поделиться

5 ответов

Нет.

И вам это не нужно. Ваш код использует его как:

final TimeZone tz = TimeZone.getTimeZone("GMT");
 ......
// thread 1 SimpleDateFormat instance
sdf.setTimeZone(tz);

// thread 2 SimpleDateFormat instance
sdf.setTimeZone(tz);

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

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

Единственный способ попасть в проблему - это изменить идентификатор и кэшировать себе часовой пояс, если вы всегда получаете его из TimeZone.getTimeZone () вы тоже в безопасности, потому что этот метод является потокобезопасным.

6
ответ дан 30 November 2019 в 22:43
поделиться

Я однажды посмотрел исходный код и пришел к выводу, что это не так.

Посмотрите на класс JodaTime timezone . В документации javadoc говорится, что это потокобезопасный и неизменяемый.

7
ответ дан 30 November 2019 в 22:43
поделиться

Это кажется в порядке. Если бы вы полагались на TimeZone.getDefault (), это была бы другая история. Поскольку другой поток потенциально может вызывать TimeZone.setDefault ().

0
ответ дан 30 November 2019 в 22:43
поделиться

Нет явной документации, в которой говорится, что TimeZone является потокобезопасным, поэтому наиболее безопасным маршрутом является предположение, что он не безопасен для потоков.

Класс TimeZone имеет два мутатора экземпляра, относящихся к ID и его смещение по Гринвичу. Здравый смысл сказал бы, что Calendar.getInstance и SimpleDateFormat не имеют никакого отношения к изменению состояния объекта TimeZone (в первом случае он используется как ключ поиска, а во втором - как контекст форматирования).

Здравый смысл или определенность - на ваш выбор.

2
ответ дан 30 November 2019 в 22:43
поделиться

Вы не изменяете свой часовой пояс, поэтому ваш код должен быть потокобезопасным независимо от того, является ли базовая реализация TimeZone потокобезопасной (за исключением статических методов, таких как (getTimeZone / getDefault / setDefault ).

1
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: