(1) Intensive Erklärung des Einzelfallmodus

Eine Notiz

只能生成一个实例的类就是实现了Singleton(单例)模式的类型。

Zwei oder vier Wege zu erreichen

1 Die einfachste Art zu schreiben (einzelner Thread)

Diese Schreibmethode gilt nur für Single-Threaded-Umgebungen, den obigen Code:

public class Singleton {

	private static Singleton instance= null;

    // 构造函数为private,阻断通过new Singleton1()的方式新建实例
	private Singleton() {
	}

	// 每次获取实例的时候通过调用此类方法
	public static Singleton Instance() {
			if(instance == null) {
					instance = new Singleton();
			}
			return instance;
	}
}  

Nachteile: Gilt nur für einen einzelnen Thread. Wenn zwei Threads gleichzeitig mit der Anweisung if (instance == null) ausgeführt werden, ist die Instanz immer noch null. Zu diesem Zeitpunkt führen beide Threads instance = new Singleton1 () aus. Informationen zum Verbesserungsschema finden Sie unter 2

2 Die Verwendung von Schlössern kann zum Multithreading verwendet werden

public class Singleton {

    private static Singleton instance = null;

    private static Lock lock = new ReentrantLock();

    private Singleton() {
    }

    public static Singleton instance() {
        lock.lock();
        if(instance == null) {
            instance = new Singleton();
        }
        lock.unlock();
        return instance;
    }
}

Durch die Verwendung von Schlössern wird die Gewindesicherheit gewährleistet. Der Nachteil ist, dass der Sperraufwand groß ist, siehe 3 zur Optimierung

3 Optimierte Version zur Reduzierung des Sperraufwands

public class Singleton {

    private static Singleton instance = null;

    private static Lock lock = new ReentrantLock();

    private Singleton() {
    }

    public static Singleton instance() {
    	// 加锁前做一个判断,减少开销
        if(instance == null) {
            lock.lock();
            if(instance == null) {
                instance = new Singleton();
            }
            lock.unlock();
        }
        return instance;
    }
}

4 Verwenden des statischen Konstruktors

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton instance() {
        return instance;
    }
}

Der Code ist relativ vereinfacht. Der einzige Nachteil besteht darin, dass die Instanz nicht erstellt wird, wenn der Singleton zum ersten Mal verwendet wird, sondern wenn der Singleton zum ersten Mal verwendet wird. Angenommen, wir fügen Singleton eine statische Methode hinzu und rufen die statische Methode auf, ohne eine Instanz zu erstellen. Entsprechend der aktuellen Situation wird die Instanz jedoch weiterhin vorzeitig erstellt, wodurch die Effizienz der Speichernutzung verringert wird.

Veröffentlicht 5 Originalartikel · Like1 · Besuche 66

Ich denke du magst

Origin blog.csdn.net/m0_37796645/article/details/105530729
Empfohlen
Rangfolge