Programación Concurrente: Hilos, Sincronización y Resolución de Conflictos
Clasificado en Informática
Escrito el en español con un tamaño de 4,36 KB
Programación Concurrente: Conceptos Fundamentales
La programación concurrente se basa en la ejecución de hilos (threads) que operan en paralelo y colaboran para realizar una tarea común. Esta concurrencia puede lograrse mediante:
- Paralelismo lógico: Un único procesador con multiprogramación.
- Paralelismo real: Múltiples procesadores o núcleos.
Ventajas y Desventajas de la Programación Concurrente
Ventajas:
- Mayor eficiencia.
- Capacidad para gestionar grandes cargas de trabajo.
- Útil en la gestión de comunicaciones.
- Diseño modular y estructurado.
- Menor hueco semántico.
Desventajas:
- Programación y depuración complejas.
Métodos de la Clase Thread
run()
: Contiene el código a ejecutar.start()
: Inicia la ejecución del hilo.isAlive()
: Devuelvetrue
si el hilo se ha iniciado y no ha finalizado,false
en caso contrario.sleep(long millis)
: Suspende el hilo durante un número determinado de milisegundos.join()
: Suspende la ejecución del hilo actual hasta que finaliza otro hilo.interrupt()
: Envía una interrupción (InterruptedException
) al hilo.yield()
: El hilo abandona voluntariamente el procesador.
Sincronización de Tareas
La sincronización de tareas es crucial en la programación concurrente y requiere de mecanismos de comunicación y sincronización.
Mecanismos de Comunicación
- Variables compartidas: Se utiliza cuando los hilos comparten el mismo espacio de memoria (típico en procesos con múltiples hilos). Requieren mecanismos de sincronización para evitar problemas.
- Intercambio de mensajes: Una actividad actúa como emisora y otra como receptora.
Mecanismos de Sincronización
- Exclusión mutua: Garantiza que solo un hilo pueda acceder a una variable o recurso compartido en un momento dado.
- Sincronización condicional: Permite que un hilo se suspenda hasta que se cumpla una condición específica.
Errores Comunes en Programación Concurrente
Errores de Consistencia de Memoria
Ocurren cuando diferentes hilos tienen vistas inconsistentes de lo que debería ser el mismo dato.
Condiciones de Carrera (Race Conditions)
Se producen cuando no hay una sincronización adecuada en las secciones críticas del código. Se pueden evitar mediante protocolos de entrada/salida que garanticen:
- Exclusión mutua.
- Progreso.
- Espera limitada.
Monitores
Un monitor es una construcción de programación (similar a una clase) que permite definir objetos compartidos entre varios hilos, garantizando la exclusión mutua y la sincronización. Existen varias variantes de monitores, incluyendo:
- Brinch Hansen
- Hoare
- Lampson-Redell
Interbloqueos (Deadlocks)
Los interbloqueos ocurren cuando varios hilos se bloquean mutuamente, esperando por recursos que están en posesión de otros hilos bloqueados. Las condiciones de Coffman describen las cuatro condiciones necesarias para que ocurra un interbloqueo:
- Exclusión mutua.
- Retención y espera (Hold and Wait).
- No expulsión (No Preemption).
- Espera circular.
Soluciones para Interbloqueos
- Prevención.
- Evitación.
- Detección y recuperación.
- Ignorar el problema (estrategia del avestruz).
Alternativas: ReentrantLock
ReentrantLock
es una clase que proporciona una alternativa a los mecanismos de sincronización básicos (synchronized
). Ofrece características adicionales como:
- Permitir establecer un plazo máximo de espera para obtener el bloqueo.
- Definir múltiples variables de condición.
- Cerrar y abrir bloqueos en diferentes métodos.
- Interrumpir las esperas con
Thread.interrupt()
.