2012-08-26 7 views
14

Ich habe unter der Annahme gearbeitet, dass weder Date noch Calendar Thread-Safe sind, aber während einer aktuellen Diskussion, sagte mir ein Mitarbeiter Calendar war thread-safe.Ist java.util.Calendar Thread sicher oder nicht?

Also habe ich etwas recherchiert, und habe nichts gefunden. Es gibt viele Leute, die argumentieren, dass es Thread-sicher ist, und viele Leute argumentieren, dass es nicht threadsicher ist. Und um das Ganze abzurunden, sagt die Dokumentation nichts, weder für Calendar noch für Date.

Also, was ist das?

+3

http: // Stapelüberlauf.com/questions/6245053/how-to-make-a-static-Kalender-thread-safe, dass –

+0

@AlexColeman Beachten Sie, dass die erste Antwort sagt "Nein", die zweite Antwort sagt "Ja", und nichts von all dieser Diskussion ist von allem unterstützt. –

+1

+1 für 'Joda Time' obwohl. Wenn Thread-Sicherheitsprobleme Ihr Anliegen sind, dann wäre dies eine gute Option. – Sujay

Antwort

24

ist ein Link zum Quellcode von Calendar und GregorianCalendar in Java 7

Wenn Sie den Code lesen, werden Sie, dass keine der Instanzmethoden sehen synchronisiert sind, und keine der Instanzfelder sind volatile. Sie werden auch sehen, dass selbst die Feldmethoden get dazu führen können, dass eine Kalenderinstanz mutiert. Und da keine Synchronisierung durchgeführt wird, sehen verschiedene Threads möglicherweise veraltete Versionen der Felder eines Kalenderobjekts nach einer solchen Mutationsoperation.

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  } 

Kurz gesagt, die Calendar Klasse Thread-sicher nicht, und GregorianCalendar ist nicht:

Für die Aufzeichnung in/bei einem Aufruf dieser Methode ist nun mal die Aktion Mutation im Bereich Methoden erhalten Entweder weil es die nicht threadsicheren Felder und Methoden erbt.

Aber nehmen Sie nicht nur mein Wort dafür. Machen Sie Ihre eigene Analyse des Quellcodes.


Und um das Ganze abzurunden, wird die Dokumentation nicht alles eine oder andere Weise sagen, nicht für Kalender, nicht einmal für Date.

Wenn die javadocs nicht die Thread-Sicherheit einer Klasse angeben, dann sollten Sie annehmen, dass es nicht thread-sicher.

4

Dokumentation von Oracle sagt nichts über Thread-Sicherheit: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html.

OpenJDK Quellcode (Build B147) implementiert java.util.Calendar in einer nicht-Thread-sichere Art und Weise, zum Beispiel:

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

Ich denke, dass es sicher ist, anzunehmen, dass die Klasse nicht Thread-sicher. Hier

-1

- Ich bin nicht sicher, von wo Ihr Freund die Informationen bekommen, aber in einfachen und geraden Begriffen gesprochen, Calendar class isnichtThread safe.

- noch in ihren Unterklassen habe ich keine synchronized Schlüsselwörter auf atomare Aussagen, noch volatile Felder in Kalenderklasse finden.

+5

Das Vorhandensein von "synchronisierten" oder "flüchtigen" Schlüsselwörtern ist kein Indikator für die Thread-Sicherheit – yegor256