Java: Ist die Exception-Klasse Thread-sicher?

8

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:

%Vor%

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?

    
Vilius Normantas 19.04.2010, 15:27
quelle

5 Antworten

7

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.

    
Michael Borgwardt 19.04.2010, 15:34
quelle
1

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.

    
KitsuneYMG 19.04.2010 15:34
quelle
1

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.

    
big lep 10.05.2010 19:03
quelle
0

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

    
jsight 19.04.2010 15:29
quelle
-1

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.

    
DJClayworth 19.04.2010 16:41
quelle

Tags und Links