5.2单例模式

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;
    }
}

优点:这种方式采用双锁机制,安全且在多线程情况下能保持高性能(我也不知道为什么两个锁比一个锁性能要搞高)
缺点:复杂

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。