Pregunta

Estoy trabajando con una empresa que produce una aplicación web usando Struts con Java. Recientemente he estado refactorizando gran parte del código para ordenar el sistema. Una técnica que he estado usando es mover las declaraciones de cierre para las transmisiones, en finalmente bloques, de métodos para una clase de utilidad. La clase de utilidad es estática y tiene métodos cercanos para varios tipos de corrientes. Al hacer esta refactorización, guardo 5 líneas de código cada vez que se debe cerrar una transmisión, lo que ha reducido el código en algunas clases en 600 líneas, lo que lo hace muy favorable. Sin embargo, me preocupa hacer esto que sea posible causar contención en esos métodos si se pone en producción.

Solo me he encontrado con el concepto de contención en programación multiproceso antes, por eso no estoy seguro de si esto causará problemas en estos casos.

es posible? ¿O simplemente mi malentendido de contención, métodos estáticos, aplicaciones web, etc.?

Gracias de antemano, Alexei Blue.

¿Fue útil?

Solución

A menos que los métodos estáticos funcionen únicamente en sus parámetros y no intente cerrar simultáneamente la misma transmisión varias veces, debería estar bien.

Los métodos en general se pueden ejecutar simultáneamente. La sincronización siempre funcionará en objetos y, por lo tanto, la contención no debe ocurrir si los objetos que usa en esos métodos son completamente distintos.

Otros consejos

Es la mejor práctica cerrar todo el controlador de archivos abiertos dentro del mismo alcance. Por ejemplo, cuando una salida de archivo está abierta en un método, también debe cerrarse con ese método. Esto también evita la mayor parte del problema de concurrencia (pero no siempre). Sin embargo, hay muchas excepciones para no hacerlo, pero el seguimiento y el cierre de todo el controlador de archivos sería más difícil en este caso.

Para su información, existe un método de cierre que hace exactamente lo que usted describe en Apache Common IO, Ioutils. Es una biblioteca popular que puede considerar usar.

Esta es una práctica común, por ejemplo, mire la clase de cierre en Guava. Por cierto, solo debe necesitar un método para poder cerrar prácticamente cualquier cosa en Java:

public static void closeQuietly(Closeable closeable) {
  if (closeable != null) {
    try {
      closeable.close();
    } catch (RuntimeException re) {
      // Do something or ignore...
    }
  }
}

Como todas las transmisiones y lectores implementan la interfaz cerrada, este método debería ser suficiente para todas sus necesidades.

En general, esto no causará contención, a menos que intente leer desde la transmisión en Say Thread-A, donde Thread-B está cerrando la transmisión. Pero si ese fuera el caso, entonces tendría esta afirmación con o sin esta refactorización. Únicamente esta refactorización no introducirá ninguna adicional contención.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top