参考链接:https://www.runoob.com/design-pattern/singleton-pattern.html
一、懒汉式(线程不安全)
懒汉的意思就是我不生成实例,到使用时才生成第一个实例。
实现简单,但因为取唯一实例时未加锁,因此不支持多线程。
public clsaa Singleton{
private static Singleton instance;
private Singleton();
public static Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
二、懒汉式(线程安全)
对getInstance函数进行加锁。但此方法效率低下,因为常见情况下都不需要同步。
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null)
singleton = new Singleton();
return singleton;
}
}
三、饿汉式
在调用获取实例函数前就将实例初始化了,不会出现懒汉式中生成多个实例的情况,因此是线程安全的。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
四、双重检测锁
多线程下安全且能保持高性能
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
为什么进行了双重检测?
参考链接:https://www.cnblogs.com/xz816111/p/8470048.html
五、登记式/静态内部类
相当于对饿汉式的改进,饿汉式在类加载时就创建对象。在类内部建一个静态的私有成员类,负责维护唯一的对象。这里登记式实现方法即通过MAP或list将类保存起来,静态内部类实现方法就是通过静态私有成员维护。
public class SingletonClass {
private static class SingletonHolde {
private static SingletonClass singletonClass = new SingletonClass();
}
private SingletonClass() {
}
public static SingletonClass getInstance() {
return SingletonHolde.singletonClass;
}
}
————————————————
版权声明:本文为CSDN博主「刘知昊」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shu15121856/article/details/81434269
六、枚举
参考本链接:https://blog.csdn.net/shu15121856/article/details/81434269