2010-04-19 8 views
8

Wie ich verstehe, Java Exception-Klasse ist sicherlich nicht unveränderlich (Methoden wie initCause und setStackTrace geben einige Hinweise dazu). Ist es zumindest Thread-sicher? Angenommen, eine meiner Klassen hat ein Feld wie das folgende:Java: ist Exception-Klasse Thread-sicher?

private final Exception myException; 

Kann ich dieses Feld sicher mehreren Threads aussetzen? Ich bin nicht bereit, konkrete Fälle zu diskutieren, wo und warum diese Situation auftreten könnte. Meine Frage ist mehr über das Prinzip: Kann ich sagen, dass eine Klasse, die das Feld des Exception-Typs exponiert, Thread-sicher ist?

Ein weiteres Beispiel:

class CustomException extends Exception 
{ 
    ... 
} 

Ist diese Klasse Thread-sicher?

Antwort

7

Beachten Sie, dass initCause()synchronized ist und setStackTrace() seinen Parameter kopiert und dann eine einzelne Zuweisung vornimmt.

So scheint Exception eigentlich mit Threadsicherheit implementiert werden. Dennoch würde ich auf jedes Design achten, bei dem Ausnahmen routinemäßig zwischen Threads weitergegeben werden (d. H. Aus einem anderen Grund, als eine sehr schwerwiegende Fehlerbedingung zu behandeln). Es fühlt sich einfach falsch an.

+0

+1 für "fühlt sich einfach falsch an." – Yishai

+0

Das erste Beispiel ist tatsächlich hypothetisch.Ich kann mir so etwas in meinem Code kaum vorstellen :) Zum zweiten Beispiel. Kann ich in meiner Dokumentation sagen, dass die Klasse CustomException threadsicher ist und gut schläft? –

+0

@Vilius: müssen Sie einige harsch-brained Anforderung erfüllen, die besagt, dass alle Klassen "fadensicher" sein müssen? Und natürlich macht eine thread-sichere Superklasse Thread-sichere Unterklassen nicht automatisch. Aber ja, ich würde keinen Schlaf verlieren. –

0

Ich glaube nicht, dass die Java-Exception-Klassen Garantien für die Threadsicherheit bieten.

+0

Gegenwärtig (d. H. "In der Kopie von Throwable.java usw., die mein Arbeitsbereich derzeit enthält") machen die Java-Ausnahmeklassen weder Haftungsausschlüsse noch Garantien hinsichtlich Thread-Sicherheit/Gleichzeitigkeit. Dies ist ein großes Problem für Klassen, die so weit verbreitet sind. –

1

für Java 6 Implementierung von throwable

initCause der Sonne ist synchronized so ist es Thread-sicher. fillInStackTrace ist auch.

setStackTrace ist nicht, aber es macht eine defensive Kopie der Eingabe und weist dann diese Kopie zu. Natürlich ist diese Methode "für RPC-Frameworks".

Solange das myException-Feld endgültig oder volatil ist, sollte es freigegeben werden.

-1

Der Zweck einer Ausnahme besteht darin, ausgelöst zu werden, wenn die Bedingung erkannt und bei der Verarbeitung abgefangen wird. Per Definition sollten diese innerhalb eines einzelnen Threads passieren. Wenn Sie eine Instanz von Ausnahme zwischen Threads teilen, verwenden Sie sie für einen Zweck, für den sie nicht entworfen wurde. Dies würde Ihre Leser verwirren und Ihr Programm weniger wartbar machen. Sie sollten wahrscheinlich eine alternative Struktur für was auch immer Sie es für verwenden.

+1

Ich sagte mindestens zwei Mal, dass dies eher eine hypothetische Frage ist ... Es hat wirklich nichts mit dem Design eines Programms zu tun. –

+0

Es scheint nicht so weit hergeholt zu haben, dass ein Fehler in einem (Arbeiter-) Thread auftritt und auf einem anderen (Request) behandelt wird. Ich sehe keinen Grund, warum Exceptions (/ Throwables) nicht threadsicher sein sollten, da dies Unterklassen freilassen würde, um threadsicher zu sein, wenn dies erforderlich ist. Der schlimmste Fall ist wirklich, wenn die Javadocs einer Klasse Threadsafety/Concurrency nicht erwähnen, da dies die ganze harte Arbeit an den (im Ausnahmefall Millionen von) Benutzer (n) belässt ... –

1

Ich glaube sicher Throwables/Exceptions zu veröffentlichen ist eine vollkommen gültige Frage. DJClayworths Kommentar, dass "wenn Sie eine Instanz von Exception zwischen Threads teilen, dann verwenden Sie es für einen Zweck, für den es nicht entworfen wurde", berücksichtigt Task-Management-Code mit Futures nicht. Es ist üblich, dass ein Worker-Thread eine Ausnahme auslöst und diese Ausnahme von einem anderen Thread behandelt werden muss. Zusätzlich zu all den obigen Kommentaren, die die synchronisierten Methoden von Throwable erwähnen, veröffentlicht Future Exceptions zwischen Threads, daher kann man sicher sagen, dass dies eine erwartete, sichere und unterstützte Funktionalität ist.