WeakHashMap: Wie "null" effizient abfangen?

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hallo,

hab eine WeakHashMap die mir als eine Art Cache dient:

[HIGHLIGHT="Java"]private static WeakHashMap<Method, Long> methodHashs = new WeakHashMap<Method, Long>();[/HIGHLIGHT]

Ich benutze diese, um anhand einer Methode schnell den dazugehörigen "Hash" zu erhalten. Ist der Hash noch nicht in der Mapp enthalten, so berechne ich ihn und trage ihn in die Liste ein.

Bisher sieht die Methode so aus:

[HIGHLIGHT="Java"]public static long computeMethodHash(Method m) {

if (methodHashs.containsKey(m)) {

synchronized (methodHashs) {
logger.trace("Got hash from map. map contains {} entries.", methodHashs.size());
return methodHashs.get(m); // <--- Hier hagelts hin und wieder NPEs
}

} else {

// berechne hash ...
// ....
// ....

synchronized (methodHashs) {
methodHashs.put(m, hash);
logger.trace("computed new hash. map now contains {} entries.", methodHashs.size());
}

return hash;
}
}[/HIGHLIGHT]

In den meisten Fällen funktioniert der Code, da zwischen "containsKey()" und "get()" die Map nicht aufgeräumt wird. Aber hin und wieder hagelts da halt auch NullpointerExceptions, weil die Map sich zwischen den beiden Aufrufen schon geändert hat, sprich der GC den Eintrag unter umständen schon entsorgt hat.

Den Cache hab ich überhaupt erst eingeführt, weil das errechnen des Hashes etwas aufwendig ist und ich diesen Rechenaufwand gerne wo möglich vermeiden möchte. Es reicht ja wenn ich den Hash einmal berechne und ihn dann cache.

Aber zurück zum Problem. Da ich wie gesagt seehr oft den Hash zur Methode haben möchte (im Worst-Case etliche tausend mal pro Sekunde), und das möglichst effizient, weiß ich (noch) nicht wie man das am performantesten regelt.

Eine Idee wäre statt zu Fragen ob die Methode in der Map bekannt ist, den Hash einfach rausholen. Da primitive aber nicht "null" sein können, müsste ich das in ein Long Objekt oder so casten und schauen ob das null ist. Und erst wenn dieses NICHT null ist, den Wert des Long-Objekts zurückgeben. Ist das Long-Objekt null, so errechne ich den Hash.

Hab aber :rtfm: dass das casten, und vor allem die Nutzung von den Wrapper-Klassen für die primitiven Datentypen nicht so performant sein soll. Da ich aber für diesen Ansatz _jedesmal_ ein Wrqapper-Objekt bräuchte, wäre das wohl ein neuer Flaschenhals in meiner Anwendung :shock:

Hab auch versucht den ganzen Mehodenbody auf das Map-Objekt zu synchronisieren, aber geholfen hat's komischerweise nicht :autsch:

Letztendlich kann man die Frage wohl so formulieren:

Wie benutzt man eine WeakHashMap richtig und vor allem performant, so dass man zuverlässig keine NPE bekommt wenn man Elemente daraus haben möchte die eigtl. primitive Datentypen sind, und diese ggf. schon abgeräumt wurden ???:L

Gruß
Alex
 
S

Spacerat

Gast
Falsch Synchronisiert würd' ich sagen. Zwischen unsynchronisiertem "containsKey()" und synchronisiertem "get()" kann ein "remove()" aus einem anderen Thread dafür sorgen, das gerade dieser Eintrag entfernt wurde. Das das auf den gesammten Body nicht funktioniert hat könnte daran liegen, das die Map zu irgendeinem kritischen Zeitpunkt noch nicht initialisiert war.
 
Zuletzt bearbeitet von einem Moderator:

Ark

Top Contributor
Wie wäre es mit einem komplett anderen Ansatz? Jedes Objekt sehe wie folgt aus:
[highlight="Java"]private boolean hashOK;
private int hash;

public int hashCode(){
if(!hashOK){
hash=/* Hash berechnen */;
hashOK=true;
}
return hash;
}[/highlight]
Das Flag hashOK muss natürlich immer zurückgesetzt werden, wenn sich ein Feld, das in hashCode() benutzt wird, ändert.

Über eine passende abstrakte Superklasse lässt sich der Code vielleicht auch sauberer gestalten.

Ark

EDIT: Ich überlege gerade, ob dies in diesem Fall überhaupt möglich ist ...

BTW: Die Mehrzahl von hash ist hashes.
 
Zuletzt bearbeitet:

tfa

Top Contributor
Eine Idee wäre statt zu Fragen ob die Methode in der Map bekannt ist, den Hash einfach rausholen. Da primitive aber nicht "null" sein können, müsste ich das in ein Long Objekt oder so casten und schauen ob das null ist. Und erst wenn dieses NICHT null ist, den Wert des Long-Objekts zurückgeben. Ist das Long-Objekt null, so errechne ich den Hash.
Das wäre die Lösung.
Hab aber :rtfm: dass das casten, und vor allem die Nutzung von den Wrapper-Klassen für die primitiven Datentypen nicht so performant sein soll. Da ich aber für diesen Ansatz _jedesmal_ ein Wrqapper-Objekt bräuchte, wäre das wohl ein neuer Flaschenhals in meiner Anwendung :shock:
Möchtest du ein super-performantes Programm, was nicht funktioniert? Oder lieber ein funktionierendes Programm, was möglicherweise ein paar Prozent langsamer ist?
 

Wildcard

Top Contributor
Hab aber :rtfm: dass das casten, und vor allem die Nutzung von den Wrapper-Klassen für die primitiven Datentypen nicht so performant sein soll. Da ich aber für diesen Ansatz _jedesmal_ ein Wrqapper-Objekt bräuchte, wäre das wohl ein neuer Flaschenhals in meiner Anwendung :shock:
Was denkst du denn was in deiner Map drin liegt? long sicherlich nicht, da ein Object erwartet wird ;)
 
T

tuxedo

Gast
Falsch Synchronisiert würd' ich sagen. Zwischen unsynchronisiertem "containsKey()" und synchronisiertem "get()" kann ein "remove()" aus einem anderen Thread dafür sorgen, das gerade dieser Eintrag entfernt wurde. Das das auf den gesammten Body nicht funktioniert hat könnte daran liegen, das die Map zu irgendeinem kritischen Zeitpunkt noch nicht initialisiert war.

Das mein erster Ansatz nicht funktioniert weiß ich auch, hatte ich ja geschrieben.

Das mit dem ganzen Body synchronisieren: Für "Fremzzugriffe" mag das funktionieren. Aber das ist eine Weak-HashMap. D.h. da "pfuscht" der GC mit rein. Und ich hab kein Plan ob der sich am "synchronized" stört. So wie's aussieht nicht.

Initialisiert ist die Map zum Zeitpunkt im dem die Klasse, die die Map als Member hat, vom Classloader geladen wird:

[HIGHLIGHT="Java"] private static WeakHashMap<Method, Long> methodHashs = new WeakHashMap<Method, Long>();[/HIGHLIGHT]

@Ark

Es geht nicht drum die korrektheit des Hashes zu testen. Ich nutze den Hash als "komnpakte" ID für die Methode über Rechnergrenzen hinweg.

@tfa

Das das funktioniert ist mir klar. Was ich eigentlich wissen wollte ist, ob es einen besseren, wohlmöglich performanteren Weg gibt.

@Wildcard

Ich denke das hat mir die Augen geöffnet. Denn schließlich muss ich die Map ja so definieren:

private static WeakHashMap<Method, Long> methodHashs = new WeakHashMap<Method, Long>();

Hätte ich auch früher drauf kommen können :eek:

Problem ist also gelöst. Machmal sieht man tatsächlich den Wald vor lauter Bäumen nicht mehr.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
Zrebna SonarLint: Warum kein Null-Referencing-CodeSmell-Hint hier? Allgemeine Java-Themen 23
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
8u3631984 Argument Captor liefert NULL zurück Allgemeine Java-Themen 2
E Class.getResourceAsStream() gibt null zurück Allgemeine Java-Themen 2
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
J Zahlen Abstand zur Null bestimmen Allgemeine Java-Themen 11
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
S An internal error occurred during: Launching null argument Allgemeine Java-Themen 1
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
N MsgPack - Null Check Allgemeine Java-Themen 5
T JasperReports mit Null Pointer Allgemeine Java-Themen 3
DanielsLPecke Compiler-Fehler Warum ist der String null? Allgemeine Java-Themen 10
M Warten bis Variabel nicht null ist Allgemeine Java-Themen 18
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
D Java Process OutputStream ist null Allgemeine Java-Themen 4
O log4j, Problem bei Ausgabe null-Wert Allgemeine Java-Themen 0
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
D Problem mit führender Null bei Schlüsselerzeugung Allgemeine Java-Themen 5
T Variablenübergabe liefert immer null Allgemeine Java-Themen 13
K Image beim catchen ist immer null Allgemeine Java-Themen 9
B Load of Known null Value Allgemeine Java-Themen 9
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
Tobse Vererbung null aus Elternklasse "dominant"? Allgemeine Java-Themen 15
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
I newInstance() liefert null zurück Allgemeine Java-Themen 4
R Attribut null Allgemeine Java-Themen 6
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
E rückgabewert ist immer null Allgemeine Java-Themen 2
N List auf null prüfen Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
R dateFormat - Uhr fängt nicht bei null an Allgemeine Java-Themen 2
P Null in ArrayList Allgemeine Java-Themen 3
N Strings mit null wiedergabe Splitten Allgemeine Java-Themen 4
mongole Formatter + null Allgemeine Java-Themen 4
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10
A Umgang mit null Allgemeine Java-Themen 16
L Object = null? Allgemeine Java-Themen 16
L null pointer exception Allgemeine Java-Themen 10
nrg Leere Objektreferenz mit != null vergleichen Allgemeine Java-Themen 4
J Null Pointer in der compare-Methode des Comparators? Allgemeine Java-Themen 18
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
D Matrix, ArrayList, null-Zellen Allgemeine Java-Themen 6
F Hibernate speichern - Null Allgemeine Java-Themen 5
knuckles12 null pointer exception bei arrays Allgemeine Java-Themen 6
N Null Durchblick in Java, Jobwechsel? Allgemeine Java-Themen 19
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
N Array mit null Werten filtern Allgemeine Java-Themen 5
S Combobox --> liefer null? Allgemeine Java-Themen 3
A java.net.UnkownHostException: null bei jar-File Allgemeine Java-Themen 16
B Null Pointer Exception bei Canvas-objekt-Aufruf Allgemeine Java-Themen 12
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
R if (obj == null || obj.isEmpty()) Allgemeine Java-Themen 21
P <null> in einer DB abfragen Allgemeine Java-Themen 4
G Nicht abgefangene Null-Pointer-Exception Allgemeine Java-Themen 2
P Image auf einem Panel mit null-Layout Allgemeine Java-Themen 8
M getResourceAsStream immer null Allgemeine Java-Themen 4
R Array komplett auf null setzen Allgemeine Java-Themen 10
A JasperReport Detail bringt null bei Datenübergabe Allgemeine Java-Themen 4
S Null Pointer Exception Allgemeine Java-Themen 10
S instanceof und null Allgemeine Java-Themen 7
M Führende Null in einem Datum Allgemeine Java-Themen 3
L null != null ? Allgemeine Java-Themen 16
Redfrettchen Rückgabe nicht sinnvoll: Exception oder null zurück? Allgemeine Java-Themen 9
B Null- oder IllegalArgumentException Allgemeine Java-Themen 12
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
K Exception im Konstruktor / Objekt == null Allgemeine Java-Themen 7
Z bedeutung (übersetzung) von null? Allgemeine Java-Themen 5
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
C Objekte null setzen? Allgemeine Java-Themen 7
F Große Datenmengen effizient programmieren Allgemeine Java-Themen 51
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
T Daten effizient verwalten Allgemeine Java-Themen 4
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
Dragonfire Datentypen Map effizient mit eigenem Key Allgemeine Java-Themen 71
T [RXTX] GPS-Maus (Comport) effizient auslesen Allgemeine Java-Themen 6
B Daten effizient ein- und auslagern Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
Ark Arkussinus effizient berechnen Allgemeine Java-Themen 12
J Datei Inhalt vergleichen (schnell & effizient!) Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben