美文网首页Android 面试专辑
单例模式一共几种?以及优缺点,运行速度最快的是哪一种?

单例模式一共几种?以及优缺点,运行速度最快的是哪一种?

作者: 光锥外 | 来源:发表于2019-06-25 19:12 被阅读0次

单例模式:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

单例模式主要有三种:

分别是懒汉式单例,饿汉式单例,登记式单例(懒汉模式变种,使用静态内部类创建)。

1.懒汉式单例
/**
 * 这个是懒汉模式,线程安全的
 */
public class Singleton {
    private static Singleton singleton;
    private Singleton() {}  //此类不能被实例化
    // 加上 synchronized 保证创建线程线程安全
    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁synchronized 才能保证单例,(如果两个线程同时调用getInstance方法,会chuxia)但加锁会影响效率。

2.饿汉式单例
/**
 * 这个是饿汉模式,类一加载就要初始化
 */
public class SingletonDemo3 {

    // 在成员变量声明的时候就要初始化
    private static SingletonDemo3 instance = new SingletonDemo3();

    private SingletonDemo3() {

    }

    public static SingletonDemo3 getInstance() {
        // 若当前实例为空,重新指向一个新的实例
        if (instance == null) {
            instance = new SingletonDemo3();

        }
        return instance;
    }
}

优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。

3.登记式模式(holder)

内部类只有在外部类被调用才加载,产生Singleton实例;又不用加锁。此模式有上述两个模式的优点,屏蔽了它们的缺点,是最好的单例模式。

/**
 * 这个是懒汉模式变种,使用静态内部类创建
 */
public class SingletonDemo4 {

    private static class SingletonHolder{
        private static final SingletonDemo4 instance = new SingletonDemo4();
    }

    private SingletonDemo4() {

    }

    public static SingletonDemo4 getInstance() {
        // 调用内部类的属性创建新的实例
        return SingletonHolder.instance;
    }
}

静态内部类这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟前几种方式不同的是:Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比饿汉方法就显得更合理。

若单例对象占用资源少,不需要延迟加载,那么使用枚举好于饿汉式,因为枚举十分安全,耗时差不多。

若单例对象占用资源多,需要延迟加载,那么使用内部类好于懒汉式,耗时差距明显。

相关文章

  • JAVA基础之单例

    JAVA单例的几种形式以及其优缺点。 Android 中的单例模式 - 简书 单例的定义:Singleton模式的...

  • 单例模式一共几种?以及优缺点,运行速度最快的是哪一种?

    单例模式:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例...

  • 单例设计模式

    单例设计模式是用的最多的设计模式,也是最简单的一中设计模式。下面来介绍下几种实现单例的方式,以及分析下各自的优缺点...

  • IOS 设计模式

    IOS开发中几种设计模式:单例模式、观察者模式、MVC模式、代理模式 一、单例模式 场景:确保程序运行期某个类,只...

  • Android 深入理解单例模式

    一、前言 本文主要记录使用单例模式的几种形式,并分析各自的优缺点。使用单例模式可以避免重复创建对象,以此来节省开销...

  • iOS开发-单例(粒)模式的介绍和实战使用

    今天给同学们讲解一下单例模式在iOS开发中的使用以及单例模式的相关优缺点,那么废话不多说,直接上代码~ 单例模式介...

  • 设计模式-Builder模式

    上一篇文章设计模式-单例模式我们介绍了单例模式的几种用法和优缺点,具体的我们需要结合项目中的场景去具体选择。这一篇...

  • 单例模式

    单例设计模式是几种设计模式中比较容易理解的,手写单例模式也是面试频繁问到的。下面总结一下单例模式的几种写法: //...

  • Android面试:单例模式一共几种?优缺点分别是什么?运行速度

    单例模式:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例...

  • java 24 设计模式

    单例模式java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、...

网友评论

    本文标题:单例模式一共几种?以及优缺点,运行速度最快的是哪一种?

    本文链接:https://www.haomeiwen.com/subject/ofwxcctx.html