Escuela Colombiana de Ingeniería – Arquitecturas de Software
Laboratorio de programación concurrente: condiciones de carrera, sincronización y colecciones seguras.
- JDK 21 (Temurin recomendado)
- Maven 3.9+
- SO: Windows, macOS o Linux
mvn clean verify
mvn -q -DskipTests exec:java -Dsnakes=4-Dsnakes=N→ inicia el juego con N serpientes (por defecto 2).- Controles:
- Flechas: serpiente 0 (Jugador 1).
- WASD: serpiente 1 (si existe).
- Espacio o botón Action: Pausar / Reanudar.
- N serpientes corren de forma autónoma (cada una en su propio hilo).
- Ratones: al comer uno, la serpiente crece y aparece un nuevo obstáculo.
- Obstáculos: si la cabeza entra en un obstáculo hay rebote.
- Teletransportadores (flechas rojas): entrar por uno te saca por su par.
- Rayos (Turbo): al pisarlos, la serpiente obtiene velocidad aumentada temporal.
- Movimiento con wrap-around (el tablero “se repite” en los bordes).
co.eci.snake
├─ app/ # Bootstrap de la aplicación (Main)
├─ core/ # Dominio: Board, Snake, Direction, Position
├─ core/engine/ # GameClock (ticks, Pausa/Reanudar)
├─ concurrency/ # SnakeRunner (lógica por serpiente con virtual threads)
└─ ui/legacy/ # UI estilo legado (Swing) con grilla y botón Action
- Toma el programa PrimeFinder.
- Modifícalo para que cada t milisegundos:
- Se pausen todos los hilos trabajadores.
- Se muestre cuántos números primos se han encontrado.
- El programa espere ENTER para reanudar.
- La sincronización debe usar
synchronized,wait(),notify()/notifyAll()sobre el mismo monitor (sin busy-waiting). - Entrega en el reporte de laboratorio las observaciones y/o comentarios explicando tu diseño de sincronización (qué lock, qué condición, cómo evitas lost wakeups).
Objetivo didáctico: practicar suspensión/continuación sin espera activa y consolidar el modelo de monitores en Java.
- Explica cómo el código usa hilos para dar autonomía a cada serpiente.
- Identifica y documenta en
el reporte de laboratorio:- Posibles condiciones de carrera.
- Colecciones o estructuras no seguras en contexto concurrente.
- Ocurrencias de espera activa (busy-wait) o de sincronización innecesaria.
- Elimina esperas activas reemplazándolas por señales / estados o mecanismos de la librería de concurrencia.
- Protege solo las regiones críticas estrictamente necesarias (evita bloqueos amplios).
- Justifica en
el reporte de laboratoriocada cambio: cuál era el riesgo y cómo lo resuelves.
- Implementa la UI con Iniciar / Pausar / Reanudar (ya existe el botón Action y el reloj
GameClock). - Al Pausar, muestra de forma consistente (sin tearing):
- La serpiente viva más larga.
- La peor serpiente (la que primero murió).
- Considera que la suspensión no es instantánea; coordina para que el estado mostrado no quede “a medias”.
- Ejecuta con N alto (
-Dsnakes=20o más) y/o aumenta la velocidad. - El juego no debe romperse: sin
ConcurrentModificationException, sin lecturas inconsistentes, sin deadlocks. - Si habilitas teleports y turbo, verifica que las reglas no introduzcan carreras.
Entregables detallados más abajo.
- Código fuente funcionando en Java 21.
- Todo de manera clara en
**el reporte de laboratorio**con:- Data races encontradas y su solución.
- Colecciones mal usadas y cómo se protegieron (o sustituyeron).
- Esperas activas eliminadas y mecanismo utilizado.
- Regiones críticas definidas y justificación de su alcance mínimo.
- UI con Iniciar / Pausar / Reanudar y estadísticas solicitadas al pausar.
- (3) Concurrencia correcta: sin data races; sincronización bien localizada.
- (2) Pausa/Reanudar: consistencia visual y de estado.
- (2) Robustez: corre con N alto y sin excepciones de concurrencia.
- (1.5) Calidad: estructura clara, nombres, comentarios; sin code smells obvios.
- (1.5) Documentación:
reporte de laboratorioclaro, reproducible;
- Número de serpientes:
-Dsnakes=Nal ejecutar. - Tamaño del tablero: cambiar el constructor
new Board(width, height). - Teleports / Turbo: editar
Board.java(métodos de inicialización y reglas enstep(...)). - Velocidad: ajustar
GameClock(tick) o elsleepdelSnakeRunner(incluye modo turbo).
mvn clean verifyIncluye compilación y ejecución de pruebas JUnit. Si tienes análisis estático, ejecútalo en verify o site según tu pom.xml.
Este laboratorio es una adaptación modernizada del ejercicio SnakeRace de ARSW. El enunciado de actividades se conserva para mantener los objetivos pedagógicos del curso.
Base construida por el Ing. Javier Toquica.