Android知识Android开发Android开发

单例模式(Singleton)

2018-03-28  本文已影响0人  奔跑的图腾

单例模式的特点

  1. 单例模式只能有一个实例。
  2. 单例类必须创建自己的唯一实例。
  3. 单例类必须向其他对象提供这一实例

应用场景

某个对象频繁被访问使用

主要有五种实现方式,懒汉式(延迟加载,使用时初始化),饿汉式(声明时初始化),双重检查,静态内部类,枚举

实现要点
声明为private来隐藏构造器
private static Singleton实例
声明为public来暴露实例获取方法

1.懒汉式,线程不安全的实现

    private static Singleton instance;
    private Singleton() {
    };
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
//由于没有同步,多个线程可能同时检测到实例没有初始化而分别初始化,从而破坏单例约束

懒汉式,线程安全但效率低下的实现

public class Singleton {
    private static Singleton instance;
    private Singleton() {
    };
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
//由于对象只需要在初次初始化时需要同步,多数情况下不需要互斥的获得对象,加锁会造成巨大无意义的资源消耗

2.饿汉式
instance在类加载时进行初始化,避免了同步问题。饿汉式的优势在于实现简单,劣势在于不是懒加载模式(lazy initialization)在需要实例之前就完成了初始化,在单例较多的情况下,会造成内存占用,加载速度慢问题 由于在调用getInstance()之前就完成了初始化,如果需要给getInstance()函数传入参数,将会无法实现

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {
    };
    public static Singleton getInstance() {
        return instance;
    }
}  

3.双重检查锁定(double checked locking pattern)

public class Singleton {
    private static Singleton instance=null;
    private Singleton(){ 
    }
    public static Singleton getInstance(){
        if(instance==null){
            synchronized(Singleton.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

4.静态内部类
优点:延迟加载,线程安全,内存消耗少(推荐使用)

public class Singleton {
    private Singleton() {
    };
    public static Singleton getInstance() {
        return Holder.instance;
    }
    private static class Holder{
        private static Singleton instance = new Singleton();
    }
}  

5.枚举

上一篇 下一篇

猜你喜欢

热点阅读