0Pricing
Java Academy · Lektion

Singleton: Threadsichere Implementierungen

Erstellen Sie ein threadsicheres Singleton mit Double-Checked Locking, einem Enum oder dem Holder-Pattern.

Singleton: Threadsichere Implementierungen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Das Singleton-Muster

Das Singleton-Muster stellt sicher, dass in der JVM nur eine Instanz einer Klasse existiert. Häufige Anwendungsfälle sind Konfigurationsmanager, Verbindungspools und Logging-Dienste.

Naives Singleton – nicht threadsicher

Die klassische verzögerte Singleton-Initialisierung versagt bei gleichzeitigem Zugriff: Zwei Threads können die Nullprüfung gleichzeitig bestehen und zwei Instanzen erzeugen.

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

Synchronisierte Methode – einfach, aber langsam

Wenn Sie synchronized zu getInstance() hinzufügen, wird die Methode threadsicher, sperrt aber bei jedem Aufruf – auch nachdem die Instanz bereits existiert. Das verursacht unnötigen Overhead.

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

Double-Checked Locking

Prüfen Sie zunächst ohne Sperre und anschließend noch einmal innerhalb eines synchronized-Blocks. Für die Verhinderung einer Umordnung von Anweisungen ist volatile für das Feld erforderlich.

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;
    }
}

Initialization-on-Demand Holder

Das sicherste und effizienteste verzögert initialisierte Singleton: Eine private statische verschachtelte Klasse enthält die Instanz. Die JVM lädt sie erst, wenn getInstance() zum ersten Mal aufgerufen wird – das Laden von Klassen ist grundsätzlich threadsicher.

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

Enum-Singleton

Effective Java empfiehlt ein enum mit einer einzigen Konstante. Dieser Ansatz ist kompakt, threadsicher, serialisierungssicher und immun gegen Reflection-Angriffe.

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

Eager Initialization

Wenn die Kosten beim Start akzeptabel sind, initialisieren Sie die Instanz beim Laden der Klasse mit einem Feld vom Typ static final. Das ist einfach und threadsicher, aber die Instanz wird immer erzeugt, selbst wenn sie nie verwendet wird.

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

Singleton und Serialisierung

Ein serialisiertes und anschließend deserialisiertes Singleton erzeugt eine neue Instanz, sofern Sie nicht readResolve() hinzufügen, das INSTANCE zurückgibt. Der enum-Ansatz erledigt dies automatisch.

private Object readResolve() { return INSTANCE; }

Singleton und Reflection-Angriffe

Reflection kann private Konstruktoren aufrufen. Schützen Sie sich dagegen, indem Sie im Konstruktor eine Ausnahme auslösen, wenn bereits eine Instanz existiert. Enum-Singletons sind laut JVM-Spezifikation immun dagegen.

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

Singletons in Dependency-Injection-Frameworks

In Spring sind Beans standardmäßig Singletons (@Scope("singleton")). Sie implementieren das Singleton-Muster nur selten manuell; überlassen Sie die Verwaltung dem DI-Container.

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

Singletons testen

Singletons sind schwer als Unit-Test zu testen, da sie globalen Zustand enthalten. Bevorzugen Sie Dependency Injection gegenüber manuell geschriebenem Singleton-Code; injizieren Sie in Tests Mock-Instanzen über Konstruktorinjektion.

Kurze Überprüfung

Welcher Singleton-Ansatz wird in Effective Java empfohlen?

Zusammenfassung

Verwenden Sie für threadsichere Singletons den Initialization-on-Demand-Holder- oder den enum-Ansatz. Vermeiden Sie naive verzögerte Initialisierung. Lassen Sie in Spring-Anwendungen das Framework die Verwaltung des Scopes übernehmen.

Häufig gestellte Fragen

Ist die Lektion „Singleton: Threadsichere Implementierungen“ kostenlos?

Ja — der vollständige Text von „Singleton: Threadsichere Implementierungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Singleton: Threadsichere Implementierungen“?

Erstellen Sie ein threadsicheres Singleton mit Double-Checked Locking, einem Enum oder dem Holder-Pattern. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Singleton: Threadsichere Implementierungen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Singleton: Threadsichere Implementierungen
  2. Factory-Method-Pattern
  3. Abstract Factory für Produktfamilien
  4. Builder-Pattern mit Fluent API
← Zurück zu Java Academy