Wenn nicht, kannst du nichts threadsicher machen. Im Fall von Calendar
ist sogar das Lesen von -Daten nicht Thread-sicher, da es interne Datenstrukturen aktualisieren kann.
Wenn möglich, würde ich stattdessen Joda Time vorschlagen:
Wenn Sie unbedingt verwenden müssen, um ein Calendar
zu verwenden, können Sie ein Sperrobjekt erstellen und den gesamten Zugriff durch eine Sperre setzen. Zum Beispiel:
Es ist aber ziemlich gemein. Du könntest nur eine eine synchronisierte Methode haben, die jedes Mal einen Klon des ursprünglichen Kalenders erstellt hat, wenn es benötigt wurde. Es ist möglich, dass du computeFields aufrufen kannst > nachfolgende Lese-Operationen thread-safe natürlich, aber persönlich würde ich es ungern versuchen.
Der Kalender ist threadsicher, vorausgesetzt Sie ändern ihn nicht. Die Verwendung in Ihrem Beispiel ist in Ordnung.
Es ist erwähnenswert, dass der Kalender keine effiziente Klasse ist und Sie ihn nur für komplexe Operationen verwenden sollten (wie den nächsten Monat / Jahr). IMHO: Wenn Sie ihn für komplexe Operationen verwenden, verwenden Sie nur lokale Variablen.
Wenn alles, was Sie wollen, ein Schnappschuss der Zeit ist, ist ein schnellerer Weg currentTimeMillis zu verwenden, der sogar ein Objekt erzeugt. Sie können das Feld volatil machen, wenn Sie es threadsicher machen wollen.
%Vor%Die Verwendung ist etwas verdächtig. Warum würdest du die aktuelle Zeit bekommen und sie global speichern? Es erinnert mich an den alten Witz.
- Haben Sie Zeit?
- Ja, ich habe es irgendwo aufgeschrieben.
Sie können nicht. Ja, Sie könnten darauf synchronisieren, aber es hat immer noch veränderbare Statusfelder. Sie müssen Ihr eigenes Kalender-Objekt erstellen.
Wenn möglich, verwenden Sie etwas Leichtes, wie ein langes Messen der Zeiten in Millisekunden, und konvertieren Sie nur in einen Kalender, wenn Sie dazu brauchen.
Erstellen Sie eine Calendar
als lokale Variable in der Methode. Wenn Sie für alle Methoden den gleichen Kalender benötigen, verwenden Sie möglicherweise Statiken, bei denen ein (Singleton oder Quasi-Singleton) -Objekt geeigneter wäre.
Tags und Links java thread-safety static calendar