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(): Devuelve true 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:

  1. Exclusión mutua.
  2. Retención y espera (Hold and Wait).
  3. No expulsión (No Preemption).
  4. 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().

Entradas relacionadas: