5.2单例模式
该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象
https://www.runoob.com/design-pattern/singleton-pattern.html
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例
解决的问题: - 一个全局使用的类频繁的创建与销毁
使用情况:
想控制实例数目,节省系统资源的时候
解决问题:
判断系统是否已有这个单例,如果有则返回,如果没有则创建。
懒汉式,线程安全
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
- 优点:第一次调用才初始化,避免内存浪费
- 缺点:必须加synchronized锁,才能保证单例,加锁会影响效率。
饿汉式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
优点:没有加锁,执行效率会提高
缺点:类加载时就初始化,浪费内存,容易产生垃圾对象
双检索/双重校验锁(DCL,即double-checked locking)
public class Singleton{
private volatile static Singleton singleton=null;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
优点:这种方式采用双锁机制,安全且在多线程情况下能保持高性能(我也不知道为什么两个锁比一个锁性能要搞高)
缺点:复杂