Verständnis des schöpferischen Modus und des Singleton-Modus

Inhaltsverzeichnis

1. Einleitung:

2. Die Vorteile von Singleton-Objekten

3. So entwerfen Sie manuell eine Singleton-Objektklasse

3.1 Hungrige chinesische Singleton-Klasse

3.2 Lazy Singleton-Klasse

3.3 IoDH-Singleton-Klasse

3.4 Mit Hilfe der Feder


1. Einleitung:

Die standardmäßig von Spring verwalteten Bean-Objekte befinden sich alle im Singleton-Modus, es sei denn, der Bereich wird gemäß der Scop-Annotation geändert.

Wenn im Singleton-Modell die globale private Variable nicht festgelegt ist, besteht bei Multithreading kein Problem der Thread-Unsicherheit.

Bei jedem Thread werden der Variablenwert des Singleton-Objekts und der Schritt, in dem der Thread ausgeführt wird, im Stapel und im Programmzähler gespeichert und im Speicher gespeichert, und es liegt keine unsichere Thread-Situation vor.

Wenn in der Klasse eine öffentliche Variable festgelegt ist, ist eine spezielle Verarbeitung erforderlich. Andernfalls verweisen mehrere Threads gemeinsam auf eine lokale Variable und es entstehen Thread-Sicherheitsprobleme:

Verarbeitungsmethode 1:

Verwenden Sie threadLocal-Thread-Variablen für die Verarbeitung

Verarbeitungsmethode 2:

Verwenden Sie zur Verarbeitung die Atomic-Atomklasse

2. Die Vorteile von Singleton-Objekten

Um Systemressourcen zu sparen, ist es manchmal erforderlich, sicherzustellen, dass eine Klasse im System vorhanden ist

Es gibt nur eine Instanz. Wenn diese eindeutige Instanz erfolgreich erstellt wurde, können wir kein weiteres Objekt desselben Typs erstellen. Alle Vorgänge können nur auf dieser eindeutigen Instanz basieren. Um die Einzigartigkeit des Objekts sicherzustellen, können wir dies durch das Singleton-Muster erreichen, das die Motivation des Singleton-Musters darstellt

3. So entwerfen Sie manuell eine Singleton-Objektklasse

3.1 Hungrige chinesische Singleton-Klasse

Wenn das Projekt zum ersten Mal geladen wird, wird es automatisch erstellt

class BeanTest{ 
    private static final BeanTest bean= new BeanTest(); 
    private BeanTest() { } 
 
    public static BeanTest getBean() {
        return bean; 
    }   
}

3.2 Lazy Singleton-Klasse

Das Konzept ähnelt Lazy Loading Lazy. Wenn diese Klasse zum ersten Mal aufgerufen wird, wird das Objekt erstellt.

Beachten Sie, dass zwei Beurteilungen erforderlich sind, um die wiederholte Erstellung von Objekten in Situationen mit mehreren Threads zu verhindern.

class LazyBean { 
    private volatile static LazyBean bean= null; 
 
    private LazyBean () { } 
 
    public static LazyBean getBean() { 
        //第一重判断
        if (bean== null) {
            //锁定代码块
            synchronized (LazyBean.class) {
                //第二重判断
                if (bean == null) {
                    bean= new LazyBean (); //创建单例实例
                }
            }
        }
        return bean; 
    }
}

3.3 IoDH-Singleton-Klasse

Die Optimierung der Zusammenführung von Faulen und Hungrigen erfolgt hauptsächlich durch die Erstellung einer internen statischen Klasse. Der Code lautet wie folgt

class IoDhBean{
	private IoDhBean() {
	}
	
	private static class CreateBean{
            private final static IoDhBean bean= new IoDhBean();
	}
	
	public static Singleton getBean() {
	    return CreateBean.bean;
	}
	
    //demo测试类是否一致
	public static void main(String args[]) {
        IoDhBean bean1 = IoDhBean.getBean();
	    IoDhBean bean2= IoDhBean.getBean();
	    System.out.println(bean1 ==bean2);
        //J结果时true,没有重复创建对象
	}
}

3.4 Mit Hilfe der Feder

Sie können eine Klasse mithilfe von Spring-Annotationen wie Service-, Common- und anderen Annotationen anpassen und diese Klasse an die Spring-Verwaltung übergeben.

Achten Sie auf die Verarbeitung interner Variablen (Verarbeitung gemäß Geschäftsregeln).

Guess you like

Origin blog.csdn.net/qq_44691484/article/details/130569534