So machen Sie einen statischen Kalender-Thread sicher

7

Ich möchte einen Kalender für einige statische Methoden verwenden und ein statisches Feld verwenden:

%Vor%

Jetzt lese ich java.util.Calendar ist nicht threadsicher. Wie kann ich diesen Thread sicher machen (er sollte statisch sein)?

    
cody 05.06.2011, 18:51
quelle

4 Antworten

14

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:

  • Die meisten Typen sind unveränderlich
  • Die unveränderlichen Typen sind Thread-sicher
  • Es ist sowieso eine generell viel bessere API

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:

%Vor%

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.

    
Jon Skeet 05.06.2011, 18:55
quelle
4

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.

    
Peter Lawrey 05.06.2011 18:59
quelle
2

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.

    
MJB 05.06.2011 18:56
quelle
0

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.

    
Andrew Lazarus 05.06.2011 18:54
quelle