Guía Definitiva Multihilo (Java)

Resumen de urgencia para el examen teórico y práctico.

⚠️ REGLA DE ORO DEL EXAMEN:
Nunca llames a run() directamente. Eso ejecuta el código en el mismo hilo.
Siempre llama a start() para crear un hilo nuevo.

1. Conceptos Básicos

2. Creación de Hilos

Existen dos formas. Debes saber las diferencias para el test:

A. extends Thread

B. implements Runnable (RECOMENDADA)

3. Métodos Clave (Cheat Sheet)

De la clase Thread (Control)

De la clase Object (Sincronización)

Solo funcionan dentro de bloques synchronized.

OBSOLETOS (No usar - Deadlock seguro)

4. Problemas de Concurrencia

  1. Race Condition (Condición de Carrera): El resultado depende del orden aleatorio de ejecución. (Ej: contador++ sin control).
  2. Deadlock (Interbloqueo): A espera a B, B espera a A. Nadie avanza. (Ej: Filósofos cenando).
  3. Starvation (Inanición): Un hilo de baja prioridad nunca recibe CPU.
  4. Inconsistencia de Memoria: Un hilo lee de caché local y no ve los cambios de otro hilo en RAM. Solución: volatile.
  5. Slipped Conditions: La condición cambia entre el momento que la verificas (if) y actúas.
Condiciones de Bernstein: Reglas teóricas para paralelizar.
1. No interferencia de Entrada.
2. No interferencia de Salida.
3. No interferencia de Antidependencia.

5. Sincronización

Synchronized

Volatile

Semáforos

6. Patrones de Código (Examen Práctico)

A. Wait / Notify (Productor-Consumidor)

public synchronized void metodo() {
        // SIEMPRE usar WHILE, nunca IF
        while (condicionDeEspera) { 
            try { wait(); } 
            catch (InterruptedException e) {}
        }
        // Realizar acción
        notifyAll(); // Despertar a otros
    }

B. Semáforos

Semaphore sem = new Semaphore(2);

    try {
        sem.acquire(); 
        // Sección crítica
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        sem.release(); // OBLIGATORIO AQUÍ
    }

7. Simulacro de Examen (18 Preguntas)

Selecciona las respuestas y pulsa "Corregir Examen" al final.

1. Si llamas directamente a `run()` en lugar de `start()`, ¿qué ocurre?

2. ¿Cuál es la principal ventaja de `implements Runnable` sobre `extends Thread`?

3. ¿Qué hace `Thread.sleep(ms)` con el monitor (candado) del objeto?

4. ¿Qué excepción lanza `wait()` si no estás dentro de un bloque synchronized?

5. ¿Qué garantiza la palabra clave `volatile`?

6. Si un hilo entra en un método `synchronized` de un objeto, ¿puede otro hilo entrar en OTRO método `synchronized` del MISMO objeto?

7. ¿Para qué sirve el método `join()`?

8. ¿Qué método despierta a TODOS los hilos que esperan en un monitor?

9. ¿Por qué se debe usar `while` (y no `if`) al comprobar condiciones con `wait()`?

10. Diferencia clave entre Concurrencia y Paralelismo:

11. ¿Qué es un Deadlock?

12. ¿Qué métodos están OBSOLETOS (Deprecated) por peligrosos?

13. ¿Qué pasa con los hilos Daemon cuando terminan todos los hilos de usuario?

14. En un Semáforo, ¿dónde debes poner SIEMPRE el `release()`?

15. ¿Qué es una "Condición de Carrera" (Race Condition)?

16. ¿Qué devuelve `isAlive()` si el hilo ya ha terminado?

17. ¿Puede `notify()` despertar a un hilo concreto que tú elijas?

18. ¿Para qué sirven las Condiciones de Bernstein?