CodeGym
Promoción
CodeGym University
Java FullStack
Aprendizaje
Cursos
Tareas
Encuestas & Cuestionarios
Juegos
Ayuda
Horario
Comunidad
Usuarios
Foro
Chat
Artículos
Historias de éxito
Actividad
Reseñas
Suscripciones
Tema claro

Lecciones

  • Reseñas
  • Sobre nosotros
Comenzar
Comenzar a aprender
Comienza a aprender ahora
  • Mi progreso
  • Cursos
  • Universidad
  • Mapa de misiones
  • Lecciones
  • Deadlock: causas, ejemplos, resolución

    JAVA 25 SELF
    Nivel 53,Lección 0
    En la lección analizamos qué es el interbloqueo de hilos (deadlock) en Java, por qué ocurre y cuáles son las cuatro condiciones necesarias para que se produzca. Con un ejemplo práctico usando synchronized mostramos cómo reproducir el problema y luego estudiamos estrategias de prevención: orden único de adquisición de recursos, uso de ReentrantLock.tryLock con timeout, reducción de secciones críticas y evitar locks anidados innecesarios. Veremos la diagnosis mediante Thread Dump y jstack, cómo reconocer los estados BLOCKED/ WAITING, y cerraremos con una checklist y errores típicos.
    Disponible
  • Livelock y Starvation: definición y ejemplos

    JAVA 25 SELF
    Nivel 53,Lección 1
    Analizamos las anomalías de concurrencia Livelock y Starvation: en qué se diferencian de Deadlock, cómo se ven en el código y en los logs. Se muestran ejemplos en Java: «trabajadores corteses» (bloqueo vivo) e inanición por prioridades y debido a bloqueos injustos. Aprendemos a detectar el problema (registro de logs, Thread dump, VisualVM, Java Mission Control) y a prevenirlo: retrasos aleatorios antes de reintentar ( Thread.sleep), algoritmos no bloqueantes, bloqueos justos mediante ReentrantLock con el indicador fairness ( new ReentrantLock(true)), secciones críticas cuidadas y evitar abusar de setPriority() y synchronized.
    Disponible
  • Colecciones thread-safe: ConcurrentHashMap y otras

    JAVA 25 SELF
    Nivel 53,Lección 2
    En esta lección veremos por qué las colecciones normales ( ArrayList, HashMap) son peligrosas en un entorno multihilo y qué alternativas seguras para hilos ofrece el paquete java.util.concurrent: ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, estructuras basadas en skip list y BlockingQueue. Hablaremos de operaciones atómicas como merge, putIfAbsent, computeIfAbsent, las compararemos con Collections.synchronizedMap, y veremos ejemplos prácticos y errores típicos (iteradores de consistencia débil, secuencias de operaciones no atómicas, etc.).
    Disponible
  • AtomicInteger, AtomicReference: operaciones atómicas

    JAVA 25 SELF
    Nivel 53,Lección 3
    ¿Por qué el incremento i ++ no funciona en multihilo, qué son las operaciones atómicas y cómo las ofrece el paquete java.util.concurrent.atomic. Analizamos AtomicInteger y AtomicReference, los métodos incrementAndGet(), compareAndSet(...), el mecanismo interno CAS (Compare-And-Swap), así como cuándo conviene elegir synchronized y cuándo — LongAdder. Al final — errores típicos: operaciones complejas, ABA y seguridad para hilos de objetos anidados.
    Disponible
  • Diagnóstico y depuración de programas multihilo

    JAVA 25 SELF
    Nivel 53,Lección 4
    Cómo capturar y leer un Thread Dump con jstack, VisualVM e IDE, reconocer los estados de los hilos ( RUNNABLE, BLOCKED, WAITING) y encontrar interbloqueos. Veremos la monitorización de hilos en Java Mission Control y Java Flight Recorder, prácticas de registro (nombres de hilos, entrada/salida de synchronized), minimización de bloqueos, pruebas de concurrencia con CountDownLatch y análisis de un caso real de deadlock. Al final — errores típicos y cómo evitarlos.
    Disponible
  • Introducción al paralelismo

    JAVA 25 SELF
    Nivel 54,Lección 0
    En esta lección analizamos la diferencia entre multihilo y paralelismo: dónde importa la capacidad de respuesta y dónde — la aceleración real en varios núcleos. Hablaremos de crear hilos mediante Thread, implementar Runnable y los pools de alto nivel ExecutorService, veremos un ejemplo sencillo de suma de un array, explicaremos cuándo el paralelismo ayuda y cuándo estorba, así como los problemas típicos: condiciones de carrera, sincronización mediante synchronized, interbloqueos y equilibrio de carga. Al final — una tabla comparativa y una visualización de escenarios.
    Disponible
  • ExecutorService, Callable, Future: ejecución de tareas

    JAVA 25 SELF
    Nivel 54,Lección 1
    Práctica de concurrencia de forma profesional: pasamos tareas a ExecutorService en lugar de crear Thread manualmente, gestionamos el pool, la cola y el ciclo de vida ( shutdown(), shutdownNow()). Analizamos la diferencia entre Runnable y Callable<T>, obtenemos resultados a través de Future y sus métodos ( get(), isDone(), cancel(...), isCancelled()). Mostraremos la ejecución de varias tareas, invokeAll/ invokeAny, el manejo de ExecutionException y errores típicos.
    Disponible
  • Streams paralelos: sintaxis y uso

    JAVA 25 SELF
    Nivel 54,Lección 2
    Entendemos cómo cambiar un flujo de datos secuencial a procesamiento en paralelo con una sola línea — mediante parallelStream() o .parallel(), qué ocurre bajo el capó en ForkJoinPool.commonPool(), cuándo la paralelización realmente acelera los cálculos (colecciones grandes, operaciones «pesadas») y dónde puede ralentizarlos. Mostraremos ejemplos de filtrado, agregación, ordenación, medición de rendimiento y analizaremos errores típicos: efectos secundarios en forEach, preservación del orden, elección de colecciones y configuración del grado de paralelismo.
    Disponible
  • ForkJoinPool y RecursiveTask: tareas recursivas

    JAVA 25 SELF
    Nivel 54,Lección 3
    Guía práctica de computación paralela en Java: cómo funciona el pool de tareas ForkJoinPool y las tareas recursivas RecursiveTask<T>/ RecursiveAction, por qué es útil el algoritmo de robo de trabajo (work-stealing), cómo dividir tareas con fork() y combinar resultados con join() dentro de compute(). Veremos el lanzamiento con pool.invoke(), un ejemplo de suma de un array y búsqueda del máximo, el papel de ForkJoinPool en parallelStream() y los errores típicos y cómo evitarlos.
    Disponible
  • Mejores prácticas de programación paralela

    JAVA 25 SELF
    Nivel 54,Lección 4
    Guía práctica de programación paralela en Java: cuándo conviene usar ExecutorService, dónde ayuda parallelStream y para qué tareas necesitas ForkJoinPool. Hablaremos de la seguridad de hilos con ConcurrentHashMap/ CopyOnWriteArrayList y clases atómicas ( AtomicInteger), mediciones de rendimiento con System.nanoTime() y JMH, gestión de errores desde Future.get() y ForkJoinTask, la reacción correcta a InterruptedException, así como técnicas de registro ( Thread.currentThread().getName()) y pruebas ( Awaitility). Al final — una tabla para elegir la herramienta y errores típicos.
    Disponible
  • Introducción a CompletableFuture

    JAVA 25 SELF
    Nivel 55,Lección 0
    En esta lección veremos por qué el código síncrono conduce a bloqueos, qué limitaciones tenía Future (como el get() bloqueante) y cómo la clase CompletableFuture del paquete java.util.concurrent cambia el estilo de trabajo con la asincronía. Practicaremos lanzar tareas en segundo plano con supplyAsync, suscribirnos al resultado con thenAccept/ thenApply, hablaremos del papel de ForkJoinPool y de los errores típicos: usar get()/ join() en el hilo principal, olvidar el manejo de errores con exceptionally/ handle, etc.
    Disponible
  • Tareas asíncronas: thenApply, thenAccept, thenRun

    JAVA 25 SELF
    Nivel 55,Lección 1
    Analizamos el arranque y la composición de cálculos asíncronos con CompletableFuture: cómo iniciar tareas mediante supplyAsync y runAsync, en qué se diferencian los manejadores thenApply, thenAccept, thenRun, y cuándo elegir sus variantes asíncronas thenApplyAsync/ thenAcceptAsync/ thenRunAsync. Hablaremos de los hilos de ejecución ( ForkJoinPool o tu Executor), de los tipos de resultados ( CompletableFuture<T>, CompletableFuture<Void>) y de errores típicos: llamadas bloqueantes get()/ join(), errores no gestionados sin exceptionally/ handle/ whenComplete, así como el intento de usar el resultado dentro de thenRun.
    Disponible
  • 1
  • ...
  • 23
  • 24
  • 25
  • 26
  • 27
  • ...
  • 30
Aprender
  • Registro
  • Curso de Java
  • Ayuda con tareas
  • Precios
  • Sintaxis de Java
Comunidad
  • Usuarios
  • Artículos
  • Foro
  • Chat
  • Historias de éxito
  • Actividad
  • Programa de afiliados
Empresa
  • Acerca de nosotros
  • Contactos
  • Reseñas
  • Sala de prensa
  • CodeGym para EDU
  • Preguntas frecuentes
  • Soporte
CodeGymCodeGym es un curso en línea para aprender programación Java desde cero. Este curso es una forma perfecta de dominar Java para principiantes. Contiene más de 1.200 tareas con verificación instantánea y un conjunto esencial de teoría sobre los fundamentos de Java. Para ayudarte a tener éxito en la formación, hemos implementado una serie de funciones motivacionales: cuestionarios, proyectos de programación, contenido sobre aprendizaje eficiente y contenidos sobre la carrera profesional de un desarrollador Java.
Síguenos
Idioma de la interfaz
English Deutsch
Español
हिन्दी Français Português Polski বাংলা 简体中文 मराठी தமிழ் Italiano Bahasa Indonesia 繁體中文 Nederlands 日本語 한국어 Bulgarian Danish Hungarian Basa Jawa Malay Norwegian Romanian Swedish Telugu Thai Українська Filipino Turkish Azərbaycan Русский Vietnamese
"Los programadores se hacen, no nacen" © 2026 CodeGym
MastercardVisa
"Los programadores se hacen, no nacen" © 2026 CodeGym