En programación concurrente , la suspensión protegida [ 1 ] es un patrón de diseño de software para gestionar operaciones que requieren la adquisición de un bloqueo y el cumplimiento de una precondición antes de su ejecución. Este patrón se aplica típicamente a las llamadas a métodos en programas orientados a objetos e implica la suspensión de la llamada al método y del hilo que la realiza hasta que se cumpla la precondición (que actúa como una protección ).
Uso
Debido a que es bloqueante , el patrón de suspensión protegida generalmente solo se usa cuando el desarrollador sabe que una llamada a un método se suspenderá durante un período de tiempo finito y razonable. Si una llamada a un método se suspende durante demasiado tiempo, el programa en general se ralentizará o se detendrá, esperando a que se cumpla la precondición. Si el desarrollador sabe que la suspensión de la llamada al método será indefinida o durante un período inaceptablemente largo, entonces puede ser preferible el patrón de bloqueo .
Implementación
En Java, la clase Object proporciona los métodos wait()y notify()para facilitar la suspensión protegida. En la implementación que se muestra a continuación, originalmente encontrada en Kuchana (2004) , si no se cumple ninguna condición previa para que la llamada al método sea exitosa, este esperará hasta que finalmente alcance un estado válido.
public class Example { synchronized void guardedMethod () { while ( ! preCondition ()) { try { // Continuar esperando wait (); // … } catch ( InterruptedException e ) { // … } } // Implementación real de la tarea } synchronized void alterObjectStateMethod () { // Cambiar el estado del objeto // … // Informar a los hilos en espera notify (); } }Un ejemplo de implementación real sería un objeto cola con un getmétodo que incluye una comprobación para detectar cuándo no hay elementos en la cola. Una vez que el putmétodo notifica a los demás métodos (por ejemplo, a otro getmétodo), getpuede salir de su estado de comprobación y continuar con la llamada. Cuando la cola esté vacía, el getmétodo volverá a entrar en un estado de comprobación.
Véase también
- El patrón de resistencia es un patrón alternativo para abordar una condición previa.
- El lenguaje de comandos protegido incluye una construcción de lenguaje similar.
- Bloqueo lector-escritor
Notas
Referencias
- Kuchana, Partha (2004). "Patrones de diseño de arquitectura de software en Java" (Documento). Boca Raton, Florida: Auerbach Publications..
- patrones de diseño de software
- Esbozos de programación informática