Java Concurrency In Practice von Brian Goetz bietet ein Beispiel für einen effizienten skalierbaren Cache für die gleichzeitige Verwendung. Die finale Version des Beispiels mit der Implementierung für die Klasse Memoizer (S. 108) zeigt einen solchen Cache. Ich frage mich, warum die Klasse nicht mit @ThreadSafe annotiert ist? Der Client, Klasse Factorizer, des Caches ist ordnungsgemäß mit @ThreadSafe annotiert. Der Anhang besagt, dass, wenn eine Klasse weder mit @ThreadSafe noch mit @Immutable versehen ist, angenommen werden sollte, dass sie nicht Thread-sicher ist. Memoizer scheint jedoch threadsicher zu sein.
Hier ist der Code für Memoizer:
%Vor%}
Es sieht sicher fadensicher aus. Wenn ich mich recht erinnere, hat Goetz in dieser speziellen Version von Memoizer die Verwendung von cache.putIfAbsent gezeigt, um eine Wettlaufsituation zwischen den get- und put-Methoden des Cache zu vermeiden.
Wie die anderen darauf hingewiesen haben, wurde es vielleicht weggelassen und Sie müssen sich auf den Kommentar im Buch verlassen, um zu sehen, ob dies die "gute" Version ist.
Frag Goetz, denke ich. Es kann nur ein Versehen sein.
Das Problem mit diesen Anmerkungen ist jedoch, dass sie bedeutungslos sind. Idealerweise müssen sie in Verbindung mit einem automatisierten Bug-Finder wie FindBugs verwendet werden. In diesem Fall würde die Annotation @Immutable
(zum Beispiel) FindBugs erlauben, seinen Detektor für Feldmutationen einzuschalten.
Ohne eine solche Überprüfung ist es für den Autor einer Bibliothek einfach, @ThreadSafe
oder @Immutable
an eine Klasse anzuhängen, wenn es nicht einmal wahr ist! Ich schlage keine vorsätzliche Täuschung vor, sondern ehrliche Fehler ... trotzdem ist das Ergebnis, dass ein Konsument der Bibliothek sich nicht auf die Anmerkungen verlassen kann. Worum geht es also?
Tags und Links java thread-safety concurrency