2012-08-26 7 views
14

Pracowałem przy założeniu, że ani Date ani Calendar nie są bezpieczne dla wątków, ale podczas niedawnej dyskusji współpracownik powiedział mi, że jest bezpieczny dla wątków.Czy wątek java.util.Calendar jest bezpieczny czy nie?

Tak więc, przeprowadziłem pewne badania i nie znalazłem nic. Jest mnóstwo ludzi, którzy twierdzą, że jest bezpieczny dla wątków, a wielu ludzi twierdzi, że nie jest bezpieczna dla wątków. I, na dodatek, dokumentacja nie mówi nic takiego, nie dla Calendar, ani nawet dla Date.

Co to jest?

+3

http: // stackoverflow.com/questions/6245053/how-to-make-a-static-calendar-thread-safe zobacz: –

+0

@AlexColeman Zauważ, że pierwsza odpowiedź brzmi "nie", druga odpowiedź mówi "tak" i nie ma żadnej dyskusji jest wspierany przez cokolwiek. –

+1

+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

Odpowiedz

24

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.

4

Dokumentacja Oracle nie mówi nic o bezpieczeństwie wątku: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html.

kodu źródłowego OpenJDK (build b147) realizuje java.util.Calendar w sposób non-thread-safe, na przykład:

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

myślę, że to jest bezpiecznie założyć, że klasa jest nie wątek bezpieczne.

-1

- Nie jestem pewien, skąd twój przyjaciel dostał informacje, ale mówiąc w prostych i prostych warunkach, Calendar class isnieThread safe.

- ja nie znaleźliśmy żadnych synchronized słowo na temat sprawozdania atomowych, ani volatile pól w klasie kalendarza ani w jej podklas.

+5

Obecność słów kluczowych "synchronized" lub "volatile" nie jest wskaźnikiem bezpieczeństwa wątków – yegor256