Android中常用的设计模式----单例

单例模式可能是平常开发中使用最多的模式了。

那么单例模式是怎么样的:单例模式的类必须保证只有一个实例存在。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如网络请求,IO操作,访问数据库等。由于类比较耗资源,所以没必要让它构造多个实例。
单例的定义
确保某一个类只有一个实例,并且自行实例化,向整个系统提供这个唯一实例。


单例的几种实现方式

饿汉式:

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

    private  Singleton() {}

    public static Singleton getInstance(){
        return  instance;
    }
}

优点:
①线程安全
②类加载时已经创建好了一个静态对象,调用时反应快。
缺点:
①资源效率不高,可能没有使用getInstance,但是其他途径加载了
该类,这个实例依然会初始化。

懒汉式:

public class Singleton{
    private static Singleton instance;
    
    private Singleton(){}
    
    public static **synchronized** Singleton getInstance(){//注意同步
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

优点:
资源利用率高,延迟初始化,可使用类其他静态方法。
缺点:
第一次加载慢,多线程情况下不必要的同步开销增大。

双重校验锁:

public class Singleton{
    private volatile static Singleton instance;//注意volatile 关键字
    
    private Singleton(){}
    
    public static synchronized Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

添加了volatile关键字,保证了执行顺序。保证了高并发下会出现的问题。

静态内部类:

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

\color{#FF0000}{推荐使用双重校验锁或者使用静态内部类方式,在非高并发情况下,去掉双重校验锁的volatile也可以}

你可能感兴趣的:(Android中常用的设计模式----单例)