Wie ich weiß, ist die Exception-Klasse von Java sicherlich nicht unveränderbar (Methoden wie initCause
und setStackTrace
geben einige Hinweise dazu). Ist es zumindest Thread-sicher? Angenommen, eine meiner Klassen hat ein Feld wie dieses:
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 anderes Beispiel:
%Vor%Ist diese Klasse threadsicher?
Beachten Sie, dass initCause()
ist synchronized
und setStackTrace()
kopiert seinen Parameter und führt dann eine einzelne Zuweisung durch.
So scheint Exception
tatsächlich mit Thread-Sicherheit implementiert zu sein. 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.
Für Suns Java 6 Implementierung von throwable
initCause
ist synchronized
, also ist es threadsicher.
fillInStackTrace
ist auch.
setStackTrace
ist nicht , aber es erstellt eine defensive Kopie der Eingabe und weist diese dann zu. Natürlich ist diese Methode "für RPC-Frameworks".
Solange Ihr myException-Feld endgültig oder volatil ist, sollte es freigegeben werden.
Ich glaube, dass die Veröffentlichung von Throwables / Exceptions eine vollkommen gültige Frage ist. 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. Neben 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.
Der Zweck einer Exception 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 das, wofür Sie es verwenden, in Erwägung ziehen.
Tags und Links java thread-safety exception