Das Singleton-Muster ist nicht einfach

Vorwort

Hallo zusammen, ich bin sehr schlau. Ein Entwurfsmuster ist eine Reihe von Code-Entwurfserfahrungen, die wiederholt verwendet wurden, den meisten Menschen bekannt sind und klassifiziert und katalogisiert sind. Der Zweck der Verwendung von Entwurfsmustern besteht darin, Code wiederzuverwenden, ihn für andere verständlicher zu machen und die Zuverlässigkeit des Codes sicherzustellen.

Heute werde ich einige relevante Wissenspunkte zum Singleton-Muster teilen und hoffe, dass es für Sie hilfreich ist.

Definition des Singleton-Musters

Das Singleton-Muster ist ein häufig verwendetes Muster für den kreativen Entwurf, dessen Kernstruktur nur eine spezielle Klasse namens Singleton enthält. Das Singleton-Muster kann sicherstellen, dass es im System nur eine Objektinstanz für eine Klasse gibt, die das Singleton-Muster verwendet.

Eigenschaften des Singleton-Musters

  1. Eine Singleton-Klasse kann nur eine Instanz haben.
  2. Eine Singleton-Klasse muss ihre eigene eindeutige Instanz erstellen.
  3. Eine Singleton-Klasse muss diese Instanz allen anderen Objekten bereitstellen

Hungriger chinesischer Stil

Das Merkmal von Hungry Style besteht darin, dass die Objektinstanz bereits während der Initialisierung erstellt wird, unabhängig davon, ob Sie sie verwendet haben oder nicht. Der spezifische Code lautet wie folgt:

public class HungrySingleton {
    
    
    // 持有自己类的引用
    private static final HungrySingleton singleton = new HungrySingleton();

    // 私有化构造器
    private HungrySingleton(){}

    // 提供获取实例的静态方法
    public static HungrySingleton getInstance(){
        return singleton;
    }
}

Vorteile: Keine Thread-Sicherheitsprobleme

Nachteile: Das Erstellen von Objekten während der Initialisierungsphase, vorausgesetzt, dass die Instanziierung des Objekts sehr zeitaufwändig ist und diese Instanz am Ende nicht verwendet wird, wäre das nicht eine Verschwendung von Ressourcen?

Fauler-Mann-Stil

Das Merkmal des Lazy-Stils besteht darin, dass das Objekt nur dann instanziiert wird, wenn es verwendet wird. Es ist relativ faul . Wenn es verwendet wird, prüft es, ob eine Instanz vorhanden ist. Wenn eine Instanz vorhanden ist, wird sie direkt zurückgegeben. Wenn Wenn nicht, wird es erstellt und dann zurückgegeben. Der spezifische Code lautet wie folgt:

public class LazySingleton {
    
    
    private static LazySingleton singleton;

    // 私有化构造器
    private LazySingleton(){}

    // 提供获取实例的静态方法
    public static LazySingleton getInstance(){
        // 若对象没有被实例化,则new一下再返回
        if (singleton == null) {
            singleton = new LazySingleton();
        }
        return singleton;
    }
}

Vorteile: Das Objekt wird nur dann instanziiert, wenn es verwendet wird

Nachteile: Das größte Problem bei dieser Implementierung besteht darin, dass sie nicht threadsicher ist. Da es keine Sperre gibt, können mehrere Objekte gleichzeitig instanziiert werden.

Doppelte Erkennungssperre

Wie der Name schon sagt, verwendet die Doppelerkennungssperre einen Sperrmechanismus mit doppelter Beurteilung , der sicher ist und in Multithread-Situationen eine hohe Leistung aufrechterhalten kann . Dies entspricht einer aktualisierten Version des Lazy-Stils. Der spezifische Code lautet wie folgt:

public class DoubleCheckLockingSingleton {
    
    

    // 注意这里多了一个volatile关键字,面试的时候经常会问这个关键字的作用
    private volatile static DoubleCheckLockingSingleton singleton;

    // 私有化构造器
    private DoubleCheckLockingSingleton(){}

    // 提供获取实例的静态方法
    public static DoubleCheckLockingSingleton getInstance(){
        if (singleton == null) {
            synchronized (DoubleCheckLockingSingleton.class) {
                if (singleton == null) {
                    singleton = new DoubleCheckLockingSingleton();
                }
            }
        }
        return singleton;
    }
}

Vorteile: Geeignet für den Einsatz in Situationen mit hoher Parallelität, Gewährleistung der Thread-Sicherheit

Nachteile: Singletons können durch Reflexion zerstört werden

statische innere Klasse

Wie der Name schon sagt, implementieren statische innere Klassen den Singleton-Modus über statische innere Klassen. Diese Methode kann den gleichen Effekt erzielen wie doppelte Erkennungssperren. Der spezifische Code lautet wie folgt:

public class StaticInnerClassSingleton {
    
    
    // 静态内部类
    private static class SingletonHolder {
        private static final StaticInnerClassSingleton singleton = new StaticInnerClassSingleton();
    }

    // 私有化构造器
    private StaticInnerClassSingleton(){}

    // 提供获取实例的静态方法
    public static StaticInnerClassSingleton getInstance() {
        return SingletonHolder.singleton;
    }
}

Vorteile: Thread-Sicherheit, Nutzung der Eigenschaften statischer innerer Klassen, um verzögertes Laden und hohe Effizienz zu erreichen

Nachteile: Singletons können durch Reflexion zerstört werden

aufzählen

In Java sind Aufzählungen natürliche Singletons . Jede Instanz hat nur ein Objekt. Dies ist eine Garantie, die durch den zugrunde liegenden internen Mechanismus von Java bereitgestellt wird.

public enum EnumSingleton {
    
    
    INSTANCE;
}

Vorteile: JVM stellt sicher, dass die Aufzählung ein natürlicher Singleton ist, Thread-sicher, unterstützt automatisch den Serialisierungsmechanismus, verhindert, dass durch Deserialisierung neue Objekte neu erstellt werden, und verhindert mehrere Instanziierungen.

Zusammenfassen

Es gibt viele Möglichkeiten, den Singleton-Modus zu implementieren. Sie werden unter drei Gesichtspunkten verglichen: ob er threadsicher ist, ob er verzögert geladen wird und ob er die Reflexionskonstruktion verhindert, wie folgt:

Implementierung des Singleton-Musters Ist es threadsicher? Ob Lazy Load Ob reflektierende Builds verhindert werden sollen
Hungriger chinesischer Stil Ja NEIN NEIN
Fauler-Mann-Stil NEIN Ja NEIN
Doppelte Erkennungssperre Ja Ja NEIN
statische innere Klasse Ja Ja NEIN
aufzählen Ja NEIN Ja

Das Singleton-Muster wird häufig bei Vorstellungsgesprächen und bei der Arbeit angetroffen. Welche Designmuster verwenden Sie häufig bei Ihrer Arbeit? Hinterlassen Sie gerne unten eine Nachricht.

-----ENDE-----

​ Freunde, denen dieser Artikel gefällt, dann muss Ihnen dieser Artikel gefallen! Dann gib ihm ein Like!

Je suppose que tu aimes

Origine blog.csdn.net/qq_41917138/article/details/126112168
conseillé
Classement