En la programación concurrente , la suspensión protegida [1] es un patrón de diseño de software para gestionar operaciones que requieren tanto la adquisición de un bloqueo como el cumplimiento de una condición previa antes de que se pueda ejecutar la operación. El patrón de suspensión protegida se aplica típicamente a las llamadas a métodos en programas orientados a objetos e implica suspender la llamada al método y el subproceso que realiza la llamada hasta que se cumpla la condición previa (que actúa como protección ).
Uso
Debido a que está bloqueando , el patrón de suspensión protegido generalmente solo se usa cuando el desarrollador sabe que una llamada a un método se suspenderá por un período de tiempo finito y razonable. Si una llamada a un método se suspende durante demasiado tiempo, el programa general se ralentizará o se detendrá, esperando que se cumpla la condición previa. Si el desarrollador sabe que la suspensión de la llamada al método será indefinida o por un período inaceptablemente largo, entonces puede preferir el patrón de resistencia .
Implementación
En Java, la clase Object proporciona los métodos wait()
y notify()
para ayudar con la suspensión protegida. En la siguiente implementación, encontrada originalmente en Kuchana (2004) , si no se cumple una condición previa para que la llamada al método sea exitosa, el método esperará hasta que finalmente entre en un estado válido.
Ejemplo de clase pública { sincronizado void guardedMethod () { while ( ! preCondition ()) { try { // Continuar esperando wait (); //… } catch ( InterruptedException e ) { //… } } // Implementación de la tarea real } sincronizada void alterObjectStateMethod () { // Cambiar el estado del objeto //… // Informar los hilos en espera notifica (); } }
Un ejemplo de una implementación real sería un objeto de cola con un get
método que tiene una protección para detectar cuando no hay elementos en la cola. Una vez que el put
método notifica a los otros métodos (por ejemplo, un get
método), el get
método puede salir de su estado protegido y continuar con una llamada. Una vez que la cola está vacía, el get
método volverá a entrar en un estado protegido.
Ver también
- El patrón de resistencia es un patrón alternativo para lidiar con una condición previa
- El lenguaje de comandos guardado incluye una construcción de lenguaje similar
- Bloqueo de lectores-escritor
Notas
- ^ Lea, Doug (2000). Programación concurrente en Java Second Edition . Reading, MA: Addison-Wesley. ISBN 0-201-31009-0.
Referencias
- Kuchana, Partha (2004). "Patrones de diseño de arquitectura de software en Java". Boca Raton, Florida: Publicaciones de Auerbach. Cite journal requiere
|journal=
( ayuda ).