Tu jest link do kodu źródłowego Calendar i GregorianCalendar w Javie 7
Jeśli odczytać kodu widać, że żadna z metod instancji są zsynchronizowane, a żaden z pól instancji są volatile
. Zobaczysz także, że nawet metody z pola mogą spowodować zmutowanie instancji Kalendarza. A ponieważ nie przeprowadzono synchronizacji, różne wątki mogą zobaczyć nieaktualne wersje pól obiektu kalendarza po takiej operacji mutowania.
Dla przypomnienia, akcja mutacja w polu dostać metody dzieje się w/w trakcie rozmowy o tej metodzie:
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 }
w skrócie, klasa Calendar
nie jest bezpieczny wątku, a nie jest GregorianCalendar
albo dlatego, że dziedziczy pola i metody, które nie są bezpieczne dla wątków.
Ale nie wierz mi na słowo. Wykonaj własną analizę kodu źródłowego.
I do góry go, dokumentacja nic nie mówi czy inny sposób, a nie dla kalendarza, ani nawet dla Date.
Jeśli Javadocs nie określają nitki bezpieczeństwa klasy, to należy zakładaćże nie jest bezpieczny wątku.
http: // stackoverflow.com/questions/6245053/how-to-make-a-static-calendar-thread-safe zobacz: –
@AlexColeman Zauważ, że pierwsza odpowiedź brzmi "nie", druga odpowiedź mówi "tak" i nie ma żadnej dyskusji jest wspierany przez cokolwiek. –
+1 dla 'Joda Time' chociaż. Jeśli problemy z bezpieczeństwem wątków są twoją obawą, skorzystanie z tego byłoby dobrym rozwiązaniem. – Sujay