2010-04-19 16 views
8

Según tengo entendido, la clase Excepción de Java ciertamente no es inmutable (métodos como initCause y setStackTrace dan algunas pistas al respecto). Entonces, ¿es al menos seguro para subprocesos? Supongamos que uno de mis clases tiene un campo como este:Java: ¿la clase de excepción es segura para subprocesos?

private final Exception myException; 

¿Puedo exponer con seguridad este campo para múltiples hilos? No estoy dispuesto a discutir casos concretos donde y por qué podría ocurrir esta situación. Mi pregunta es más sobre el principio: ¿puedo decir que una clase que expone el campo del tipo Excepción es segura para subprocesos?

Otro ejemplo:

class CustomException extends Exception 
{ 
    ... 
} 

¿Es esta clase thread-safe?

Respuesta

7

Tenga en cuenta que initCause() es y setStackTrace() copia su parámetro y luego realiza una única asignación.

De hecho, Exception parece implementarse teniendo en cuenta la seguridad de la rosca. Aún así, desconfiaría de cualquier diseño donde las excepciones se pasen rutinariamente entre hilos (es decir, por cualquier motivo que no sea el manejo de una condición de error muy grave). Simplemente se siente mal.

+0

+1 por "simplemente se siente mal". – Yishai

+0

El primer ejemplo es en realidad hipotético.Apenas puedo imaginar algo como esto en mi código :) En cuanto al segundo ejemplo. ¿Puedo decir en mi documentación que la clase CustomException es segura para subprocesos y duerme mucho después? –

+0

@Vilius: ¿tiene que cumplir algún requisito de cerebro de hare diciendo que todas las clases "deben ser seguras para subprocesos"? Y, por supuesto, una superclase segura para subprocesos no hace que las subclases sean seguras para subprocesos. Pero sí, no perdería nada de esto. –

0

No creo que las clases Java Exception brinden ninguna garantía de threadsafety.

+0

Actualmente (es decir, "en la copia de Throwable.java etc. que mi Área de trabajo contiene actualmente"), las clases de excepción de java no hacen renuncias ni garantizan la seguridad de subprocesos/concurrencia. Este es un gran problema para las clases que se utilizan de forma tan amplia como estas. –

1

Para la implementación de Java de Sun 6 de throwable

initCause es synchronized por lo que es seguro para subprocesos. fillInStackTrace es demasiado.

setStackTrace es no, pero hace una copia defensiva de la entrada y luego asigna esa copia. Por supuesto, ese método es "para frameworks rpc".

Siempre que su campo myException sea final o volátil, debería estar bien para compartir.

-1

El objetivo de una excepción es lanzarse cuando se detecta y captura la condición cuando se maneja. Por definición, esto debería suceder dentro de un solo hilo. Si comparte una instancia de Exception entre hilos, entonces la está utilizando para un propósito para el que no fue diseñada. Hacer eso confundirá a sus lectores y hará que su programa sea menos sostenible. Probablemente deberías considerar una estructura alternativa para lo que sea que la estés usando.

+1

Dije al menos dos veces que esta es más una pregunta hipotética ... Realmente no tiene nada que ver con el diseño de ningún programa. –

+0

No parece tan exagerado tener un error en un hilo (trabajador) y manejado en otro (solicitud)? No veo ninguna razón por la cual las Excepciones (/ Throwables) no deben ser seguras, ya que esto dejaría a las subclases libres de ser seguras en caso de ser necesario. El peor caso es realmente cuando los javadocs de una clase no mencionan threadsafety/concurrency, ya que eso deja todo el trabajo duro al (en caso de excepción, millones de) usuario (s) ... –

1

Creo que la publicación segura de Throwables/Exceptions es una pregunta perfectamente válida. El comentario de DJClayworth de que "si está compartiendo una instancia de Exception entre hilos, entonces lo está utilizando para un propósito para el cual no fue diseñado", no tiene en cuenta el código de administración de tareas con Futures. Es común que un hilo de trabajo arroje una excepción, y para que esa excepción necesite ser manejada por un hilo diferente. Además de todos los comentarios anteriores que mencionan los métodos sincronizados de Throwable, Future publica Excepciones entre hilos, por lo tanto, creo que es seguro decir que es una funcionalidad esperada, segura y compatible.

Cuestiones relacionadas