0Pricing
Java Academy · Lección

Singleton: implementaciones seguras para hilos

Construya un Singleton seguro para hilos mediante bloqueo con doble comprobación, una enumeración o el patrón holder.

Singleton: implementaciones seguras para hilos es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

El patrón Singleton

Singleton garantiza que solo exista una instancia de una clase en la JVM. Casos de uso habituales: gestores de configuración, grupos de conexiones y servicios de registro.

Singleton ingenuo: no es seguro para subprocesos

El singleton diferido clásico falla con el acceso simultáneo: dos subprocesos pueden superar a la vez la comprobación de null y crear dos instancias.

public class Config {
    private static Config instance;
    private Config() {}
    public static Config getInstance() {
        if (instance == null) {              // race condition!
            instance = new Config();
        }
        return instance;
    }
}

Método sincronizado: sencillo, pero lento

Añadir synchronized a getInstance() lo hace seguro para subprocesos, pero bloquea en cada llamada, incluso después de que exista la instancia, lo que supone una sobrecarga innecesaria.

public static synchronized Config getInstance() {
    if (instance == null) instance = new Config();
    return instance;
}

Bloqueo con doble comprobación

Compruebe primero sin bloqueo y vuelva a comprobar dentro de un bloque synchronized. El campo debe tener volatile para evitar que se reordenen las instrucciones.

public class Config {
    private static volatile Config instance;
    private Config() {}
    public static Config getInstance() {
        if (instance == null) {
            synchronized (Config.class) {
                if (instance == null) instance = new Config();
            }
        }
        return instance;
    }
}

Holder de inicialización bajo demanda

Es el singleton diferido más seguro y eficiente: una clase anidada estática privada contiene la instancia. La JVM solo la carga cuando se llama por primera vez a getInstance(); la carga de clases es segura para subprocesos de forma inherente.

public class Config {
    private Config() {}
    private static final class Holder {
        static final Config INSTANCE = new Config();
    }
    public static Config getInstance() {
        return Holder.INSTANCE;
    }
}

Singleton con enum

Effective Java recomienda un enum con una sola constante. Es conciso, seguro para subprocesos, seguro frente a la serialización e inmune a los ataques de reflexión.

public enum AppConfig {
    INSTANCE;
    private String apiUrl = "https://api.example.com";
    public String getApiUrl() { return apiUrl; }
}
// Usage:
String url = AppConfig.INSTANCE.getApiUrl();

Inicialización anticipada

Si el coste de inicio es aceptable, inicialice la instancia cuando se cargue la clase mediante un campo static final. Es sencillo y seguro para subprocesos, pero la instancia siempre se crea, aunque nunca se utilice.

public class Config {
    private static final Config INSTANCE = new Config();
    private Config() {}
    public static Config getInstance() { return INSTANCE; }
}

Singleton y serialización

Un singleton serializado y después deserializado produce una instancia nueva, a menos que añada readResolve() para devolver INSTANCE. El enfoque basado en enum gestiona esto automáticamente.

private Object readResolve() { return INSTANCE; }

Singleton y ataques de reflexión

La reflexión puede invocar constructores privados. Para protegerse, lance una excepción en el constructor si ya existe una instancia. Los singletons basados en enum son inmunes según la especificación de la JVM.

private Config() {
    if (Holder.INSTANCE != null) {
        throw new IllegalStateException("Use getInstance()");
    }
}

Singleton en frameworks de inyección de dependencias

En Spring, los beans son singletons de forma predeterminada (@Scope("singleton")). Rara vez tendrá que implementar manualmente el patrón Singleton; deje que el contenedor de DI gestione el ámbito.

@Component  // Spring manages a single instance
public class FeatureFlags {
    private final boolean darkMode = true;
    public boolean isDarkMode() { return darkMode; }
}

Pruebas de singletons

Los singletons son difíciles de probar unitariamente porque mantienen un estado global. Prefiera la inyección de dependencias al código Singleton manual; inyecte instancias mock en las pruebas mediante inyección por constructor.

Comprobación rápida

¿Qué enfoque de Singleton recomienda Effective Java?

Repaso

Para obtener singletons seguros para subprocesos, use el Holder de inicialización bajo demanda o el enfoque basado en enum. Evite la inicialización diferida ingenua. En las aplicaciones Spring, deje que el framework gestione los ámbitos.

Preguntas frecuentes

¿La lección «Singleton: implementaciones seguras para hilos» es gratis?

Sí — el texto completo de «Singleton: implementaciones seguras para hilos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Singleton: implementaciones seguras para hilos»?

Construya un Singleton seguro para hilos mediante bloqueo con doble comprobación, una enumeración o el patrón holder. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Singleton: implementaciones seguras para hilos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Singleton: implementaciones seguras para hilos
  2. Patrón Factory Method
  3. Abstract Factory para familias de productos
  4. Patrón Builder con API fluida
← Volver a Java Academy