Top 40 Preguntas y Respuestas de Entrevista sobre Multihilo en Java – Edición 2026

Preparar una entrevista sobre multihilo en Java exige una comprensión profunda de los conceptos de concurrencia y experiencia práctica. A continuación encontrará 40 preguntas cuidadosamente elaboradas y respuestas expertas que cubren desde definiciones básicas hasta temas avanzados como hilos virtuales y concurrencia estructurada.
👉 Descarga Gratuita PDF: Preguntas y Respuestas de Entrevista Java Multithreading
1) ¿Qué es el Multihilo en Java y para qué se utiliza?
El multihilo permite a una aplicación Java ejecutar múltiples hilos concurrentemente, maximizando el uso de CPU y mejorando la capacidad de respuesta. Es especialmente valioso para tareas ligadas a E/S, computaciones a gran escala y actualizaciones de GUI donde un hilo puede bloquearse mientras otro continúa procesando.
Beneficios
- Mayor utilización de CPU
- Reducción de latencia en operaciones independientes
- Mejora de la capacidad de respuesta de la UI
Ejemplo: Un servidor web puede manejar docenas de peticiones de clientes simultáneamente asignando cada petición a un hilo separado, evitando así el bloqueo en operaciones de E/S.
2) Explique el ciclo de vida de un hilo en Java.
Los hilos de Java pasan por los siguientes estados:
| Estado | Descripción |
|---|---|
| New | Hilo creado pero no iniciado. |
| Runnable | Hilo listo para ejecutarse o en ejecución. |
| Blocked | Hilo esperando un bloqueo de monitor. |
| Waiting | Hilo esperando indefinidamente la señal de otro hilo. |
| Timed Waiting | Hilo esperando durante una duración especificada. |
| Terminated | Hilo que ha finalizado su ejecución. |
Cuando se invoca t.start(), el hilo pasa de New a Runnable.
3) ¿Cuál es la diferencia entre un proceso y un hilo?
| Criterio | Proceso | Hilo |
|---|---|---|
| Memoria | Espacio de direcciones propio | Comparte memoria del proceso |
| Comunicación | Requiere IPC | Comparte memoria directamente |
| Coste de Creación | Costoso | Ligero |
| Impacto de Fallo | Aislado | Puede afectar a hermanos |
Por ejemplo, un proceso navegador puede contener múltiples hilos para renderizado, red e interacción de usuario.
4) ¿Cómo funciona la sincronización en Java?
La sincronización garantiza que solo un hilo acceda a un recurso compartido a la vez, previniendo condiciones de carrera y corrupción de datos. La palabra clave synchronized bloquea either un método completo o un bloque específico.
- Método Sincronizado – bloquea el monitor del método.
- Bloque Sincronizado – bloquea un objeto elegido.
synchronized void increment() { count++; }
5) ¿Cuáles son las diferentes formas de crear un hilo en Java?
- Extender
Threadclass MyThread extends Thread { public void run() { System.out.println("Hilo ejecutándose"); } } new MyThread().start(); - Implementar
Runnableclass MyRunnable implements Runnable { public void run() { System.out.println("Runnable ejecutándose"); } } new Thread(new MyRunnable()).start(); - Callable & Future (moderno) – devuelve un valor y puede lanzar excepciones checked.
Callable
task = () -> 42; Future result = executor.submit(task); System.out.println(result.get());
6) ¿Cuál es la diferencia entre start() y run()?
| Aspecto | start() | run() |
|---|---|---|
| Creación de Hilo | Crea nuevo hilo SO | Ejecuta en hilo actual |
| Invocación | Programa hilo en JVM | Llamada simple a método |
| Concurrencia | Ejecución asíncrona | Ejecución secuencial |
Llamar a t.start() lanza un nuevo hilo; t.run() se comporta como cualquier otro método.
7) Explique el concepto de thread safety y cómo lograrlo.
La seguridad de hilos asegura que el acceso concurrente a datos compartidos no corrompa el estado. Puede lograrse mediante:
- Bloques o métodos
synchronized - Variables
volatile - Bloqueos explícitos (ej.
ReentrantLock,ReadWriteLock) - Colecciones thread-safe (
ConcurrentHashMap,CopyOnWriteArrayList) - Clases atómicas (
AtomicInteger,AtomicBoolean)
AtomicInteger counter = new AtomicInteger(); counter.incrementAndGet();
8) ¿Cuál es la diferencia entre wait(), sleep() y yield()?
| Método | Clase | Libera Bloqueo | Propósito | Duración |
|---|---|---|---|---|
wait() | Object | Sí | Esperar notificación | Hasta notificación |
sleep() | Thread | No | Pausar ejecución | Tiempo fijo |
yield() | Thread | No | Sugerir cambio planificador | Impredecible |
Use wait() para comunicación entre hilos; use sleep() para pausar un hilo.
9) ¿Cómo mejora el Framework Executor la gestión de hilos?
El framework desacopla el envío de tareas de la creación de hilos, permitiendo pooling eficiente y reutilización de recursos. Es parte de java.util.concurrent y ofrece:
- Reutilización de hilos para menor overhead
- Tipos de pool flexibles (Fixed, Cached, Single, Scheduled, Work-Stealing)
- Mecanismos de apagado graceful
ExecutorService executor = Executors.newFixedThreadPool(5); executor.submit(() -> System.out.println("Tarea ejecutada")); executor.shutdown();
10) ¿Qué tipos de pools de hilos están disponibles en Java?
| Tipo de Pool | Método Factory | Descripción |
|---|---|---|
| FixedThreadPool | newFixedThreadPool(n) | Número fijo de hilos |
| CachedThreadPool | newCachedThreadPool() | Crea hilos según necesidad, reutiliza inactivos |
| SingleThreadExecutor | newSingleThreadExecutor() | Un hilo worker para ejecución secuencial |
| ScheduledThreadPool | newScheduledThreadPool(n) | Soporta tareas retardadas o periódicas |
| WorkStealingPool | newWorkStealingPool() | Utiliza procesadores disponibles dinámicamente |
11) ¿Qué es un deadlock en Java y cómo prevenirlo?
Un deadlock ocurre cuando dos o más hilos esperan indefinidamente a que otros liberen bloqueos. Surge típicamente por orden inconsistente de bloqueos.
synchronized (A) { synchronized (B) { /*...*/ } }
synchronized (B) { synchronized (A) { /*...*/ } }
Estrategias de prevención:
- Adquirir bloqueos en orden global consistente.
- Usar
tryLock()con timeout. - Evitar bloqueos anidados cuando sea posible.
- Preferir utilidades de concurrencia de alto nivel sobre bloqueos manuales.
12) Diferencia entre synchronized y ReentrantLock.
| Característica | synchronized | ReentrantLock |
|---|---|---|
| Adquisición | Implícita | Explícita vía lock() |
| Liberación | Automática al salir del método | Manual vía unlock() |
| Try/Timeout | No disponible | Soporta tryLock() y timeout |
| Equidad | No configurable | Soporta ordenación justa |
| Variables Condition | No soportadas | Soporta múltiples objetos Condition |
ReentrantLock lock = new ReentrantLock(); if (lock.tryLock(1, TimeUnit.SECONDS)) { try { /* sección crítica */ } finally { lock.unlock(); } }
13) Diferencia entre volatile y synchronized.
| Aspecto | volatile | synchronized |
|---|---|---|
| Propósito | Visibilidad | Atomicidad + visibilidad |
| Atomicidad | Sin garantía | Garantizada |
| Bloqueo | No | Sí |
| Caso de Uso | Flags simples | Operaciones compuestas |
volatile boolean running = true;
synchronized void increment() { count++; }
14) Explique ThreadLocal en Java.
ThreadLocal proporciona datos específicos de hilo, eliminando la necesidad de estado mutable compartido. Cada hilo accede a su propia copia aislada.
ThreadLocalcounter = ThreadLocal.withInitial(() -> 0); counter.set(counter.get() + 1);
- Previene corrupción de datos
- Útil para contexto por hilo (ej. IDs de sesión)
- Debe llamarse
remove()en pools de hilos para evitar fugas de memoria
15) ¿Qué son las clases atómicas en Java y por qué se usan?
Las clases atómicas (ej. AtomicInteger, AtomicBoolean, AtomicReference) realizan operaciones thread-safe sin bloqueos usando CAS (Compare-And-Swap). Ofrecen mayor throughput para actualizaciones simples comparado con bloques synchronized.
AtomicInteger counter = new AtomicInteger(); counter.incrementAndGet();
16) ¿Qué es un semáforo y cómo difiere de un bloqueo?
| Aspecto | Semáforo | Bloqueo |
|---|---|---|
| Propósito | Limitar acceso concurrente | Exclusión mutua |
| Permisos | Múltiples | Único |
| Bloqueo | Adquiere permiso | Adquiere propiedad |
| Caso de Uso | Pooling de conexiones | Protección sección crítica |
Semaphore sem = new Semaphore(3); sem.acquire(); // usar recurso sem.release();
17) Explique el Framework Fork/Join.
Introducido en Java 7, permite ejecución paralela de tareas recursivamente divisibles usando algoritmo work-stealing. Hilos inactivos roban trabajo de los ocupados, maximizando uso de CPU.
class SumTask extends RecursiveTask{ protected Integer compute() { if (end - start <= threshold) return computeDirectly(); int mid = (start + end) / 2; SumTask left = new SumTask(start, mid); SumTask right = new SumTask(mid, end); left.fork(); return right.compute() + left.join(); } }
18) ¿Cómo mejora CompletableFuture la programación asíncrona?
CompletableFuture permite operaciones asíncronas no bloqueantes y componibles, eliminando el callback hell y soportando encadenamiento, manejo de excepciones y composición paralela.
CompletableFuture.supplyAsync(() -> "Hola") .thenApply(str -> str + " Mundo") .thenAccept(System.out::println);
19) ¿Qué es un hilo daemon?
Los hilos daemon se ejecutan en segundo plano, proporcionando servicios como recolección de basura o tareas de temporizador. La JVM termina todos los hilos daemon automáticamente cuando no quedan hilos de usuario.
Thread daemon = new Thread(() -> System.out.println("Daemon ejecutándose")); daemon.setDaemon(true); daemon.start();
20) Mejores prácticas para multihilo en Java.
- Preferir utilidades de concurrencia de alto nivel (ExecutorService, BlockingQueue).
- Evitar estado mutable compartido; favorecer inmutabilidad.
- Usar colecciones concurrentes sobre wrappers sincronizados.
- Manejar interrupciones correctamente y restaurar flag de interrupción.
- Apagar executors graceful con
shutdown()oshutdownNow(). - Minimizar alcance de sincronización para reducir contención.
- Perfilar antes de optimizar; herramientas como JFR y async-profiler ayudan a identificar hotspots.
21) ¿Qué es el Modelo de Memoria de Java (JMM) y por qué es importante?
El JMM define cómo los hilos interactúan a través de memoria, asegurando visibilidad, ordenación y atomicidad. Establece la relación happens-before, crítica para escribir código concurrente correcto.
- Visibilidad: Cambios de un hilo deben ser vistos por otros.
- Ordenación: Acciones ordenadas para preservar consistencia.
- Atomicidad: Ciertas operaciones son indivisibles.
22) Diferencia entre ConcurrentHashMap y synchronizedMap.
| Característica | ConcurrentHashMap | synchronizedMap |
|---|---|---|
| Granularidad de bloqueo | Nivel segmento (parcial) | Mapa completo |
| Rendimiento bajo contención | Alto | Bajo |
| Claves/valores null | No permitidos | Permitidos |
| Consistencia iterador | Weakly consistent | Fail-fast |
| Lecturas concurrentes | Permitidas | Bloqueadas |
23) Detección y depuración de deadlocks.
- Thread dumps vía
jstack <pid>revelan deadlocks. - VisualVM o JConsole proporcionan monitorización en tiempo real.
- Detección programática con
ThreadMXBean.findDeadlockedThreads().
24) Parallel streams vs. hilos explícitos.
Los parallel streams usan internamente Fork/Join, ofreciendo API de alto nivel para procesamiento de datos. Hilos explícitos requieren gestión manual pero dan control fino.
| Aspecto | Parallel Streams | Hilos |
|---|---|---|
| Abstracción | API alto nivel | Control bajo nivel |
| Gestión | Automática vía ForkJoinPool | Pool manual |
| Ajuste | Usa pool común | Tamaño pool personalizado |
| Manejo errores | Limitado | Control total |
25) CountDownLatch, CyclicBarrier y Phaser.
| Característica | CountDownLatch | CyclicBarrier | Phaser |
|---|---|---|---|
| Reset | No | Sí | Sí |
| Partes | Fijas | Fijas | Dinámicas |
| Caso de uso | Esperar tareas terminen | Hilos se reúnan | Coordinación dinámica |
CountDownLatch latch = new CountDownLatch(3); for (...) new Thread(() -> { /* trabajo */ latch.countDown(); }).start(); latch.await();
26) Diferencia entre Callable y Runnable.
| Aspecto | Runnable | Callable |
|---|---|---|
| Valor retorno | No | Sí |
| Excepciones checked | No | Sí |
| Paquete | java.lang | java.util.concurrent |
Callabletask = () -> 42; Future result = executor.submit(task); System.out.println(result.get());
27) BlockingQueue para productor-consumidor.
BlockingQueue ofrece operaciones bloqueantes thread-safe que simplifican el patrón productor-consumidor.
BlockingQueuequeue = new ArrayBlockingQueue<>(10); new Thread(() -> queue.put(1)).start(); // Productor new Thread(() -> System.out.println(queue.take())).start(); // Consumidor
- Elimina
wait()/notify()manual. - Soporta implementaciones acotadas y no acotadas.
28) Inanición de hilo (starvation) y livelock.
La inanición ocurre cuando hilos de baja prioridad nunca reciben tiempo de CPU. El livelock sucede cuando hilos cambian continuamente de estado sin progresar. Mitigación incluye bloqueos justos, evitar esperas activas y planificación adecuada.
29) Mejorando rendimiento de aplicaciones multihilo.
- Usar pools de hilos.
- Reducir alcance de sincronización.
- Aprovechar estructuras de datos concurrentes.
- Preferir objetos inmutables.
- Evitar false sharing.
- Ajustar cuenta de hilos a núcleos CPU.
- Usar E/S asíncrona para operaciones bloqueantes.
30) Escenario real de multihilo.
En una pasarela de pagos, el procesamiento concurrente de transacciones se optimizó mediante:
- ExecutorService para hilos worker.
- ConcurrentHashMap para estado de transacciones.
- ReentrantLock para bloqueo a nivel de cuenta.
- CountDownLatch para sincronización por lotes.
- CompletableFuture para respuestas asíncronas.
Resultado: 35% ganancia throughput y 40% reducción latencia.
31) Hilos Virtuales en Java.
Los hilos virtuales, introducidos en Java 21, son hilos ligeros gestionados por la JVM, permitiendo millones de tareas concurrentes con overhead mínimo.
| Característica | Hilos Plataforma | Hilos Virtuales |
|---|---|---|
| Gestionados por | SO | JVM |
| Coste creación | Alto | Muy bajo |
| Nivel concurrencia | Miles | Millones |
| Planificación | Nivel SO | Cooperativa JVM |
| Caso uso | Tareas CPU-bound | I/O-bound / alta concurrencia |
Thread.startVirtualThread(() -> System.out.println("Hilo virtual ejecutándose"));
32) Concurrencia Estructurada.
Previsualizada en Java 21, la concurrencia estructurada trata múltiples tareas concurrentes como una sola unidad, asegurando que se inicien, gestionen y terminen juntas. Elimina hilos huérfanos y simplifica propagación de errores.
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Future user = scope.fork(() -> findUser()); Future order = scope.fork(() -> fetchOrderCount()); scope.join(); scope.throwIfFailed(); System.out.println(user.resultNow() + " tiene " + order.resultNow() + " pedidos."); }
33) Reactive Streams en Java.
Reactive Streams proporciona modelo no bloqueante, consciente de back-pressure para manejar flujos de datos, base para frameworks como Project Reactor, RxJava y Spring WebFlux.
Publisher– produce datos.Subscriber– consume datos.Subscription– controla flujo.Processor– tanto publisher como subscriber.
Flow.Publisherpublisher = subscriber -> subscriber.onNext(42);
34) Manejo correcto de interrupción de hilos.
Siempre comprobar Thread.interrupted() en bucles, limpiar recursos y preservar estado de interrupción tras capturar InterruptedException.
while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // restaurar flag break; } }
35) Paralelismo vs. concurrencia.
La concurrencia gestiona múltiples tareas intercalando ejecución, mientras el paralelismo ejecuta tareas simultáneamente en múltiples núcleos CPU.
| Concepto | Definición | Ejemplo |
|---|---|---|
| Concurrencia | Intercalar tareas | Manejar 1000 peticiones cliente concurrentemente |
| Paralelismo | Ejecución simultánea | Ejecutar cómputos en núcleos CPU |
36) Herramientas y técnicas de profiling de hilos.
| Herramienta | Propósito |
|---|---|
| jstack | Captura thread dump |
| jconsole / VisualVM | Monitorización tiempo real |
| Java Flight Recorder (JFR) | Profiling bajo overhead |
| Mission Control (JMC) | Visualizar grabaciones JFR |
| async-profiler | Profiling CPU y asignación |
| ThreadMXBean | Inspección programática |
ThreadMXBean bean = ManagementFactory.getThreadMXBean(); System.out.println(bean.getThreadCount());
37) Cuellos de botella comunes de rendimiento.
- Contención excesiva de bloqueos.
- False sharing de variables.
- Overhead de cambio de contexto.
- Sincronización inadecuada.
- Abuso de variables volatile.
Optimizaciones incluyen bloqueo de grano fino, estructuras lock-free, minimizar creación de hilos y usar almacenamiento thread-local.
38) Algoritmos lock-free, wait-free y obstruction-free.
| Tipo | Definición | Garantía |
|---|---|---|
| Lock-free | Al menos un hilo progresa. | Progreso sistema completo. |
| Wait-free | Cada hilo progresa en pasos acotados. | Garantía más fuerte. |
| Obstruction-free | Progreso en ausencia de contención. | Garantía más débil. |
Operaciones AtomicInteger son lock-free; colas bloqueantes usan bloqueos.
39) Internos de ForkJoinPool.
Cada worker mantiene su propia deque; workers inactivos roban tareas de otros, reduciendo contención y mejorando throughput.
ForkJoinPool pool = new ForkJoinPool(); pool.submit(() -> IntStream.range(0, 100).parallel().forEach(System.out::println));
40) Diseñando sistema altamente concurrente para millones de peticiones.
- Hilos Virtuales para manejo ligero de peticiones.
- Reactive Streams para E/S asíncrona.
- Concurrencia Estructurada para ciclos de vida predecibles.
- Cachés alto rendimiento (ConcurrentHashMap, Caffeine).
- Colas thread-safe (Disruptor, BlockingQueue).
- Monitorización con JFR & JMC.
- CompletableFuture para flujos asíncronos.
Resultado: Lograr millones de conexiones concurrentes con bloqueo mínimo y uso óptimo de recursos.
🔍 Top Preguntas de Entrevista Java Multithreading con Escenarios Reales y Respuestas Estratégicas
A continuación, diez preguntas realistas, lo que esperan los entrevistadores y respuestas de ejemplo pulidas.
1) Diferencia entre proceso e hilo en Java?
El candidato debe explicar fundamentos SO y JVM, uso de memoria y flujo de ejecución. Por ejemplo, un proceso navegador contiene múltiples hilos para renderizado, red e entrada de usuario.
2) Propósito de la palabra clave synchronized?
Explica control de concurrencia, bloqueos intrínsecos y thread safety. Asegura que solo un hilo accede a sección crítica a la vez.
3) Problema desafiante de multihilo enfrentado y resuelto?
Describe escenario deadlock, cómo lo identificaste vía thread dumps, y resolviste forzando orden consistente de bloqueos.
4) Modelo de Memoria Java y visibilidad?
Describe relaciones happens-before, volatile y constructos de sincronización que garantizan visibilidad y ordenación.
5) Diferencia entre wait(), notify() y notifyAll()?
Explica comunicación entre hilos y mecánica de monitores.
6) Optimizando una aplicación multihilo?
Identificar contención de bloqueos, reemplazar synchronized con ConcurrentHashMap, y mostrar ganancias medibles de throughput.
7) Actualizando estructura de datos compartida de forma segura?
Usar colecciones thread-safe o bloqueo explícito con ReentrantLock para control granular.
8) Rol de ExecutorService?
Gestiona pool de hilos worker, reduce overhead y simplifica gestión de ciclo de vida.
9) Solucionando una race condition?
Reproducir bajo carga, mejorar logging, y corregir añadiendo sincronización adecuada.
10) Diseñando solución multihilo con prioridades variables?
Usar priority queue con ThreadPoolExecutor y comparador personalizado para tareas de mayor prioridad.
Java
- HashMap en Java: Guía completa con ejemplos prácticos
- Top 30 Preguntas y Respuestas de Entrevista Eclipse para 2026
- Dominando los argumentos de línea de comandos en Java: cómo pasar y analizar parámetros
- Método Java String.contains(): Cómo comprobar subcadenas – Ejemplos prácticos
- Dominando Java ConcurrentHashMap: Operaciones, Ejemplos y Mejores Prácticas
- Dominando Java String.endsWith(): Cómo comprobar sufijos de cadena con ejemplos
- Clase InputStream de Java: Métodos Principales y Ejemplo Práctico
- Estructuras de Datos en Java: Explorando Clases Core y Collections Framework
- Dominando el método compareTo() de Java String: Sintaxis, casos de uso y ejemplos prácticos
- Convierte fácilmente Strings a enteros en Java: Guía paso a paso
- Dominando los Algoritmos de Colecciones de Java: Ordenación, Mezcla y Más