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.
http: // Stapelüberlauf.com/questions/6245053/how-to-make-a-static-Kalender-thread-safe, dass –
@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 für 'Joda Time' obwohl. Wenn Thread-Sicherheitsprobleme Ihr Anliegen sind, dann wäre dies eine gute Option. – Sujay