Wie erstellt man ein thread-sicheres Singleton in Java?

Erstellen eines Thread-sicheren Singletons in Java mit Double-Checked Locking

Ein Singleton ist ein Entwurfsmuster, das in der Programmierung verwendet wird, um sicherzustellen, dass nur eine einzige Instanz einer Klasse in einer Java-Anwendung existiert. Um ein Singleton in Java zu erstellen, verwenden wir vorzugsweise Lazy-Initialization, da auf diese Weise die Singleton-Instanz erst bei Bedarf erstellt wird.

Jedoch, bei der Verwendung von Multithreading kann es Probleme geben, da mehrere Threads gleichzeitig auf die Instanz zugreifen können. Dies kann zu unerwarteten Ergebnissen oder Fehlern führen. Um dies zu vermeiden, wird das Double-Checked Locking verwendet.

Double-Checked Locking

Double-Checked Locking ist ein Programmieransatz, um die Thread-Sicherheit zu gewährleisten. In Java umfasst dies die Überprüfung der Singleton-Instanz zweimal vor und nach dem synchronized Block.

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

In diesem Code wird das Singleton-Objekt als volatile markiert, um zu verhindern, dass Threads zwischengespeicherte Werte der uniqueInstance-Variable verwenden, was zu einer mangelnden Synchronität führen könnte.

Warum nicht andere Methoden?

Es könnte die Frage auftauchen, warum man nicht einfach alle Methoden synchronisieren oder alle Variablen als volatile deklarieren kann. Der Grund dafür, dass das Double-Checked Locking der Vorzug gegeben wird, besteht darin, dass diese anderen Methoden oft zu großem Overhead führen und die Leistung beeinträchtigen können. Mit dem Double-Checked Locking wird die Synchronisation erst dann durchgeführt, wenn die Instanz null ist, dadurch wird die Leistung maximiert, ohne die Sicherheit zu beeinträchtigen.

Zusammenfassung

Um ein thread-sicheres Singleton in Java zu erstellen, verwendet man den Ansatz des Double-Checked Locking. Es bietet eine effiziente Möglichkeit, die Singleton-Instanz erst bei Bedarf zu erstellen und gleichzeitig die Thread-Sicherheit zu gewährleisten. Andere Methoden, wie das komplette Synchronisieren aller Methoden oder das Deklarieren aller Variablen als volatile, könnten zu erheblichen Leistungseinbußen führen, weshalb sie vermieden werden sollten.

Finden Sie das nützlich?