La concurrencia en informática designa la capacidad de un sistema para gestionar varias tareas cuyos intervalos de ejecución se solapan temporalmente. No implica necesariamente que todas las tareas se ejecuten al mismo tiempo en distintos núcleos, sino que varios hilos, procesos o rutinas asíncronas avanzan de forma intercalada o cooperativa dentro de un mismo programa informático. Para una introducción general, véase programas informáticos.

Características y modelos

Existen varios modelos prácticos para estructurar concurrencia. Entre los más comunes figuran:

  • Hilos y procesos: ejecución preemptiva o cooperativa con memoria compartida o aislada.
  • Eventos y bucles de despacho: programación orientada a callbacks o async/await para manejar I/O sin bloquear.
  • Actores: entidades que intercambian mensajes y evitan el estado compartido.
  • Modelos de paso de mensajes y CSP: canalización y sincronización explícita entre concurrentes.

Problemas habituales y mecanismos de control

La concurrencia introduce desafíos de corrección y rendimiento. Entre ellos destacan las condiciones de carrera, donde dos o más unidades acceden y modifican datos compartidos sin sincronización; los interbloqueos (deadlocks), cuando recursos se quedan mutuamente bloqueados; y los livelocks, en que las entidades continúan cambiando estado sin progresar. Para mitigarlos se emplean primitivas como mutexes, semáforos, monitores, variables de condición y operaciones atómicas, además de técnicas como diseño sin bloqueo y verificación formal.

La elección de una estrategia de sincronización influye directamente en la escalabilidad y en la complejidad del programa. Un uso excesivo de bloqueos puede degradar el rendimiento; un diseño sin protecciones puede provocar errores difíciles de reproducir.

Diferencia entre concurrencia y paralelismo

Concurrencia y paralelismo son conceptos relacionados pero distintos: la concurrencia trata de la estructura y de la administración de tareas que pueden solaparse temporalmente; el paralelismo implica ejecutar realmente varias operaciones a la vez, aprovechando múltiples unidades de hardware. En muchos sistemas modernos ambos conceptos conviven: la concurrencia organiza el trabajo y el paralelismo lo ejecuta en múltiples procesadores cuando están disponibles. Para contrastarlo con mayor detalle, consulte recursos sobre computación paralela.

Usos prácticos y ejemplos

La concurrencia es fundamental en servidores que gestionan numerosas conexiones simultáneas, interfaces gráficas que deben permanecer reactivas mientras realizan tareas de fondo, sistemas empotrados con múltiples sensores y actuadores, y en pipelines de procesamiento de datos. En arquitecturas con varios núcleos, el rendimiento puede mejorar si la concurrencia se implementa de forma que permita paralelismo real sobre varios procesadores.

Lenguajes y entornos ofrecen distintos modelos y herramientas: Java y POSIX threads para hilos tradicionales, Go con goroutines y canales, Erlang con actores, y mecanismos async/await en lenguajes modernos para programación asíncrona. Probar y depurar aplicaciones concurrentes requiere pruebas de estrés, herramientas de análisis dinámico y, en casos críticos, técnicas formales de verificación.