Heim > Java > javaLernprogramm > Hauptteil

Eine kurze Diskussion über mehrere gängige Entwurfsmuster in Java: Singleton-Muster

无忌哥哥
Freigeben: 2018-07-23 11:25:10
Original
1756 Leute haben es durchsucht

1. Singleton-Muster

Es ist eines der am häufigsten verwendeten Entwurfsmuster in Java. Seine Kernstruktur enthält nur eine spezielle Klasse namens Singleton. Das Singleton-Muster kann sicherstellen, dass es nur eine Instanz der Klasse im System gibt, die dieses Muster anwendet.

2. Musteranforderungen

1. Ihre eigene Konstruktionsmethode muss privat sein

2 eine öffentliche statische Methode für andere Objekte, um die Instanz zu erhalten

3. Mehrere Implementierungsmethoden

Hungriger chinesischer Stil

public class Simple {
private static Simple simple = new Simple();
private Simple() {
}
public static Simple getInstance() {
return simple;
}
}
Nach dem Login kopieren

Diese Implementierungsmethode wird verwendet, wenn die Klasse geladen wird. Instanziierung ist erfolgt ohne Lazy Loading und ist Thread-sicher.

Lazy Man Style

public class Slacker {
private static volatile Slacker slacker = null;
private Slacker() {
}
/**
* 最简单的懒汉式实现
* @return
*/
public static Slacker getInstance() {
if(slacker == null) {
slacker = new Slacker();
}
return slacker;
}
}
Nach dem Login kopieren

Diese Implementierung ist die grundlegendste Implementierung. Das größte Problem besteht darin, dass gleichzeitige Zugriffsmethoden streng genommen nicht unterstützt werden Es ist kein Singleton-Modell.

public class Slacker {
//volatile关键字的作用
//1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。
//2、防止指令重排序--通过内存屏障实现
private static volatile Slacker slacker = null;
private Slacker() {
}
/**
* 加synchronized关键字解决线程同步问题
* @return
*/
public static synchronized Slacker getInstanceSync() {
if(slacker == null) {
slacker = new Slacker();
}
return slacker;
}
}
Nach dem Login kopieren

Diese Methode zum Hinzufügen synchronisierter Sperren zu Methoden kann das Problem des gleichzeitigen Zugriffs durch Threads lösen und Singletons implementieren. Das Hinzufügen von Sperren beeinträchtigt jedoch die Effizienz und wird daher häufig nicht auf diese Weise verwendet.

Sperre doppelt prüfen

public class Slacker {
//volatile关键字的作用
//1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。
//2、防止指令重排序--通过内存屏障实现
private static volatile Slacker slacker = null;
private Slacker() {
}
/**
* 双重检查锁解决线程同步问题
* @return
*/
public static Slacker getInstanceDoubleLock() {
if(slacker == null) {
synchronized (Slacker.class) {
if(slacker == null) {
slacker = new Slacker();
}
}
}
return slacker;
}
}
Nach dem Login kopieren

Diese Methode verwendet einen Doppelsperrmechanismus, der sich an den gleichzeitigen Multithread-Zugriff anpassen und eine hohe Leistung aufrechterhalten kann.

Statische innere Klassenimplementierung

/**
* 静态内部类方式实现单例模式
*
* 当StaticInnerClass第一次被加载时,并不需要去加载StaticInnerClassHoler,只有当getInstance()方法第一次被调用时,
* 才会去初始化staticInnerClass,第一次调用getInstance()方法会导致虚拟机加载StaticInnerClassHoler类,这种方法不仅能
* 确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
*
* @author chenf
*
*/
public class StaticInnerClass {
private StaticInnerClass() {
}
// 静态内部类
private static class StaticInnerClassHoler {
// 在静态内部类中定义外部类的实例
private static StaticInnerClass staticInnerClass = new StaticInnerClass();
}
/**
* 获取时调用静态内部类的类属性获取外部类的实例
*
* @return
*/
public static StaticInnerClass getInstance() {
return StaticInnerClassHoler.staticInnerClass;
}
}
Nach dem Login kopieren

Diese Methode kann nicht nur einen sicheren Multithread-Zugriff erreichen, sondern auch den internen Klassenlademechanismus verwenden, um verzögertes Laden zu erreichen.

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über mehrere gängige Entwurfsmuster in Java: Singleton-Muster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage