From 3903352b4f67219965173a03e849180c2486e1c5 Mon Sep 17 00:00:00 2001 From: Jacoboo Date: Wed, 4 Feb 2026 23:55:38 -0500 Subject: [PATCH 1/3] FEAT: PARTE II 1 --- README.md | 55 +++++++++++++++++++ .../java/co/eci/snake/core/Direction.java | 10 +++- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8313a23..c0d9823 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,20 @@ co.eci.snake ### 1) Análisis de concurrencia - Explica **cómo** el código usa hilos para dar autonomía a cada serpiente. + +Respuesta: + +Exíte una clase llamada SnakeRunner que implementa runnable, eso quiere decir que la función de la clase +es decir qué tarea debe hacer el hilo. Esta clase tiene 5 atributos: `snake`, `board`, `baseSleepMs`, `turboSleepMs` y `turboTicks`. + +A continuación se mostrará lo que hace el hilo al iniciar: +1. Verifíca que el hilo no esté interrumpido. +2. Si no lo está entonces puede que la serpiente cambie de dirección en el tablero. +3. Si la serpiente choca contra un obstáculo, esta cambia de dirección de forma aleatoria. +4. Si la serpiente come un turbo entonces el tiempo en el que está dormido el hilo será menor por lo que la serpiente se mueve más rápido, pero con el tiempo vuelve a su velocidad normal. + +Cabe resaltar que cada serpiente corre su método run() en paralelo con los demás. + - **Identifica** y documenta en **`el reporte de laboratorio`**: - Posibles **condiciones de carrera**. - **Colecciones** o estructuras **no seguras** en contexto concurrente. @@ -148,3 +162,44 @@ Incluye compilación y ejecución de pruebas JUnit. Si tienes análisis estátic 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.** + + + + +## REPORTE DE LABORATORIO +### 1) Análisis de concurrencia +**Cómo los hilos dan autonimía a cada serpiente** + +Exíte una clase llamada SnakeRunner que implementa runnable, eso quiere decir que la función de la clase +es decir qué tarea debe hacer el hilo. Esta clase tiene 5 atributos: `snake`, `board`, `baseSleepMs`, `turboSleepMs` y `turboTicks`. + +A continuación se mostrará lo que hace el hilo al iniciar: +1. Verifíca que el hilo no esté interrumpido. +2. Si no lo está entonces puede que la serpiente cambie de dirección en el tablero. +3. Si la serpiente choca contra un obstáculo, esta cambia de dirección de forma aleatoria. +4. Si la serpiente come un turbo entonces el tiempo en el que está dormido el hilo será menor por lo que la serpiente se mueve más rápido, pero con el tiempo vuelve a su velocidad normal. + +Cabe resaltar que cada serpiente corre su método run() en paralelo con los demás. + +**Condiciones carrera** + +Hay tres candidatos posibles: `res`, `turboTicks` y `board.step(snake)` + +- res: es una variable local dentro del hilo asi que cada hilo tiene un res diferente por lo que no sería una condición +carrera. +- turboTicks: en cada interación turboTicks está disminuyendo, así que esta si sería una variable mutable. El problema es que +la varaible no se comparte en cada hilo, es una variable "privada" de cada hilo. +- board.step(snake): puede ser una condición de carrera porque todas las serpientes, cada una manejada con un hilo, interactuan con un mismo tablero. + +**Colecciones o estructuras no seguras para hilos** + +- HashSet: La clase Board usa esta colección para almacenar `obstáculos`, `ratones` y `turbos`. + +¿Cuál es el inconveniente? + +El problema es que HashSet no es una colección segura para hilos. Cuando varias serpientes interactua al mismo tiempo con estas colecciones, pueden ocurrir condiciones de carrera. En el caso de los ratones, si una serpiente se come un ratón, el ratón debe ser +eliminado del Hash y además se debe poner un nuevo ratón aleatoriamente en el tablero y se debe agregar a la colección. Si otra serpiente modifíca la colección al mismo tiempo, puede que halla un resultado incosistente. + +- HashMap: +**Sincronización innecesaria** + diff --git a/src/main/java/co/eci/snake/core/Direction.java b/src/main/java/co/eci/snake/core/Direction.java index fe1600d..9a9fecf 100644 --- a/src/main/java/co/eci/snake/core/Direction.java +++ b/src/main/java/co/eci/snake/core/Direction.java @@ -1,4 +1,10 @@ package co.eci.snake.core; -public enum Direction { UP(0,-1), DOWN(0,1), LEFT(-1,0), RIGHT(1,0); - public final int dx, dy; Direction(int dx, int dy){ this.dx=dx; this.dy=dy; } } +public enum Direction { + UP(0,-1), + DOWN(0,1), + LEFT(-1,0), + RIGHT(1,0); + public final int dx, dy; Direction(int dx, int dy){ + this.dx=dx; this.dy=dy; } +} From 2bc9054ef3d01701e3aa25e6f93e4d4698067224 Mon Sep 17 00:00:00 2001 From: Jacoboo Date: Thu, 5 Feb 2026 11:59:37 -0500 Subject: [PATCH 2/3] =?UTF-8?q?FIX:=20se=20mejor=C3=B3=20la=20respuesta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++++- .../Captura de pantalla 2026-02-05 113609.png | Bin 0 -> 53096 bytes src/main/java/co/eci/snake/core/Board.java | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/img/Captura de pantalla 2026-02-05 113609.png diff --git a/README.md b/README.md index c0d9823..ec6f3cf 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,15 @@ la varaible no se comparte en cada hilo, es una variable "privada" de cada hilo. El problema es que HashSet no es una colección segura para hilos. Cuando varias serpientes interactua al mismo tiempo con estas colecciones, pueden ocurrir condiciones de carrera. En el caso de los ratones, si una serpiente se come un ratón, el ratón debe ser eliminado del Hash y además se debe poner un nuevo ratón aleatoriamente en el tablero y se debe agregar a la colección. Si otra serpiente modifíca la colección al mismo tiempo, puede que halla un resultado incosistente. -- HashMap: +- HashMap: la clase Board utiliza esta estructura de datos para guardar `teleports`. + +HashMap tampoco es thread-safe. Si no se protegiera adecuadamente, accesos concurrentes podrían causar inconsistencias en los pares de teletransporte. + + **Sincronización innecesaria** +![Captura de pantalla 2026-02-05 113609.png](src/img/Captura%20de%20pantalla%202026-02-05%20113609.png) + +En la imagen podemos ver que estos métodos utilizan la palabra clave `synchronized`. Aunque estos métodos pueden ser llamados desde distintos hilos, no interactúan directamente con la lógica de +movimiento de las serpientes ni modifican el estado del tablero, por lo que su sincronización resulta innecesaria. + diff --git a/src/img/Captura de pantalla 2026-02-05 113609.png b/src/img/Captura de pantalla 2026-02-05 113609.png new file mode 100644 index 0000000000000000000000000000000000000000..a31d5f2389a909cbee18da1a546820388e893d09 GIT binary patch literal 53096 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 yO}7i~+?BPLS0s~o47 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 literal 0 HcmV?d00001 diff --git a/src/main/java/co/eci/snake/core/Board.java b/src/main/java/co/eci/snake/core/Board.java index be2cfe9..483e79e 100644 --- a/src/main/java/co/eci/snake/core/Board.java +++ b/src/main/java/co/eci/snake/core/Board.java @@ -31,7 +31,7 @@ public Board(int width, int height) { public int width() { return width; } public int height() { return height; } - public synchronized Set mice() { return new HashSet<>(mice); } + public synchronized Set mice() {return new HashSet<>(mice); } public synchronized Set obstacles() { return new HashSet<>(obstacles); } public synchronized Set turbo() { return new HashSet<>(turbo); } public synchronized Map teleports() { return new HashMap<>(teleports); } From d881536bb6ae69b19c7384dd74dfa2294a4c74ac Mon Sep 17 00:00:00 2001 From: Jacoboo Date: Thu, 5 Feb 2026 14:30:05 -0500 Subject: [PATCH 3/3] =?UTF-8?q?FIX:=20se=20mejor=C3=B3=20la=20respuesta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ec6f3cf..d2e9cdf 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,8 @@ carrera. la varaible no se comparte en cada hilo, es una variable "privada" de cada hilo. - board.step(snake): puede ser una condición de carrera porque todas las serpientes, cada una manejada con un hilo, interactuan con un mismo tablero. +- La clase **snake**: La clase es accedida concurrentemente por múltiples threads sin sincronización. + **Colecciones o estructuras no seguras para hilos** - HashSet: La clase Board usa esta colección para almacenar `obstáculos`, `ratones` y `turbos`.