Weiter zu Kens Antwort, wenn das Erstellen eines schwergewichtigen Objekts, das später weggeworfen wird, NICHT akzeptabel ist (Sie wollen garantieren, dass nur ein Objekt für jeden Schlüssel aus irgendeinem Grund erstellt wird), dann können Sie dies tun, indem .. .. eigentlich nicht. Mach es nicht selbst. Verwenden Sie die google-collections (jetzt guava) MapMaker class:
Map<KeyType, HeavyData> cache = new MapMaker<KeyType, HeavyData>()
.makeComputingMap(new Function<KeyType, HeavyData>() {
public HeavyData apply(KeyType key) {
return new HeavyData(key); // Guaranteed to be called ONCE for each key
}
});
Dann ein einfaches cache.get(key)
nur arbeitet und vollständig entfernt man mit etwa tricky Aspekte der Parallelität und syncrhonization kümmern.
Beachten Sie, dass, wenn Sie einige ausgefallenere Funktionen hinzufügen möchten, wie Ablauf, es ist nur
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
und man kann leicht auch weiche oder schwache Werte entweder für Schlüssel oder Daten verwenden, wenn die Javadoc für mehr erforderlich (siehe Details)
Ich frage mich nur: Was sind wirklich Ihre Anforderungen für das Caching? Müssen Sie die vollständige transitive Sperrung Ihres Schwergewichtsobjekts zwischenspeichern, damit es im gesamten Cluster Ihrer Anwendungsserver konsistent ist? Wenn dies der Fall ist, ist dies ein nicht-triviales Problem, das zu lösen ist, und Sie sollten besser eine Cache-Bibliothek wie ehcache verwenden. – Alan