Вопрос по java, calendar – Является ли java.util.Calendar поток безопасным или нет?

18

Я работал в предположении, что ниDate ниCalendar поточнобезопасны, но во время недавнего обсуждения сотрудник сказал мнеCalendar был потокобезопасным.

Итак, я провел небольшое исследование и ничего не придумал. Есть много людей, которые утверждают, что это потокобезопасно, и множество людей, которые утверждают, что это потокобезопасно. И, в довершение всего, в документации ничего не сказано так или иначе, не дляCalendarни даже дляDate.

Итак, что это?

+1 заJoda Time хоть. Если вы беспокоитесь о проблемах с безопасностью потоков, используйте этот вариант. Sujay
stackoverflow.com/questions/6245053/… видеть, что Alex Coleman
@ DanielC.Sobral Тем не менее, первый проголосовал 8 раз, получил правильный ответ и, похоже, был хорошо поддержан. Alex Coleman
@mojoken Рискуя очевидным, безопасность потоков относится к нескольким потокам, использующим один и тот же экземпляр. Daniel C. Sobral
@AlexColeman Обратите внимание, что в первом ответе указано «нет», во втором ответе - «да», и ни одно из всего этого обсуждения ничем не подкреплено. Daniel C. Sobral

Ваш Ответ

3   ответа
28

Календарь а такжеГригорианский календарь в Java 7

Если вы прочитаете код, то увидите, что ни один из методов экземпляра не синхронизирован, и ни одно из полей экземпляра не являетсяvolatile, Вы также увидите, что даже полеget методы могут вызвать изменение экземпляра Календаря. А поскольку синхронизация не выполняется, различные потоки могут видеть устаревшие версии полей объекта Calendar после такой операции мутирования.

Для записи, действие мутации в поле get методы происходит в / во время вызова этого метода:

 1555 protected void complete()
 1556       {
 1557           if (!isTimeSet)
 1558               updateTime();
 1559           if (!areFieldsSet || !areAllFieldsSet) {
 1560               computeFields(); // fills in unset fields
 1561               areAllFieldsSet = areFieldsSet = true;
 1562           }
 1563       }

Короче говоря,Calendar класс не является потокобезопасным, иGregorianCalendar также не потому, что он наследует не поточнобезопасные поля и методы.

Но не верь мне на слово. Сделайте свой собственный анализ исходного кода.

And, to top it off, the documentation doesn't say anything one way or another, not for Calendar, nor even for Date.

Если javadocs не указывает потокобезопасность класса, то вам следуетassume что это не потокобезопасно.

4

http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html.

OpenJDK исходный код (сборка B147) реализуетjava.util.Calendar не потокобезопасным способом, например:

public void setTimeInMillis(long millis) {
  // skipped
  time = millis;
  isTimeSet = true;
  areFieldsSet = false;
  computeFields();
  areAllFieldsSet = areFieldsSet = true;
}

Я думаю, что можно с уверенностью предположить, что классnot Поток безопасно.

-1

- Я не уверен, откуда ваш друг получил информацию, но, говоря просто и понятно,Calendar class is not Thread safe.

- Я не нашел ни одногоsynchronized ключевые слова на атомные заявления, ниvolatile поля в классе календаря, ни в его подклассах.

присутствиеsynchronized или жеvolatile ключевые слова не является индикатором безопасности потока

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