Diese Frage nagt mich für eine Weile, aber ich habe noch keine vollständige Antwort gefunden (z. B. dieses ist für C# Initializing disposable resources outside or inside try/finally). Betrachten wir zwei folgenden Java-Code-Fragmente:Java versuchen schließlich Variationen
Closeable in = new FileInputStream("data.txt");
try {
doSomething(in);
} finally {
in.close();
}
und zweite Variation
Closeable in = null;
try {
in = new FileInputStream("data.txt");
doSomething(in);
} finally {
if (null != in) in.close();
}
Der Teil, der mir Sorgen macht, ist, dass der Faden könnte etwas zwischen dem Moment Ressource unterbrochen werden erfasst (zB Datei geöffnet ist) Der resultierende Wert wird jedoch nicht der jeweiligen lokalen Variablen zugewiesen. Gibt es noch andere Szenarien der Faden könnte als über andere in dem Punkt unterbrochen werden:
- InterruptedException (zB über Thread # Interrupt()) oder OutOfMemoryError Ausnahme ausgelöst
- JVM-Exits (zB über töten, System. exit())
- Hardware fehlschlagen (oder Fehler in JVM für eine vollständige Liste :)
ich gelesen habe, dass der zweite Ansatz etwas mehr „idiomatische“ ist aber IMO in dem obigen Szenario gibt es keinen Unterschied und in allen anderen Szenarien sind sie gleich.
So ist die Frage:
Was sind die Unterschiede zwischen den beiden sind? Was sollte ich bevorzugen, wenn ich Bedenken bezüglich der Ressourcenfreigabe habe (besonders in stark multi-threading Anwendungen)? Warum?
Ich würde mich freuen, wenn mich jemand auf Teile von Java/JVM-Spezifikationen verweist, die die Antworten unterstützen.
solange Sie die Ressource im try-Block erworben haben ... – pgras
Leider bedeutet "verwaltet", dass es nur einen Teil der Probleme der Ressourcenverwaltung löst (wenn auch eine beträchtliche). Wenn Sie viele Ressourcen erwerben, sollten Sie immer noch darauf achten, sie zu veröffentlichen, da es in der Regel eine begrenzte Menge von ihnen gibt. Und ja, da sind Schlösser. Und Deadlocks. –
@pgras Warum möchten Sie die Ressourcen im 'try' Block erwerben? Das macht nur einen Fehler in Ihrem Code. –