美文网首页android真实面试题全解析
【Android必问面试题】手撸单例以及优缺点分析

【Android必问面试题】手撸单例以及优缺点分析

作者: 不做android | 来源:发表于2021-04-12 18:04 被阅读0次

饿汉单例

public class Singleton {
    private static Singleton instence = new Singleton();

    private Singleton() {

    }
    
    public static Singleton getInstance() {
        return instence;
    }
}
  • 在类被加载进入内存的时候就创建单一的instance对象,这种模式比较消耗内存资源。
  • 优点:获取对象的速度快;避免了多线程的同步问题。
  • 缺点:类加载过程慢。

饿汉变种单例

public class Singleton {


    private Singleton() {

    }
    private static class SingletonHolder{
        private static final  Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

  • 这种单例模式在第一次类加载时并不会初始化,只有在第一次调用getInstance()时虚拟机加载SingletonHolder并初始化SingleTon实例,也是线程安全的,也是推荐使用的。
  • 优点:线程安全,节约资源
  • 缺点:第一次加载时反应稍慢

懒汉单例

public class Singleton{
    private static Singleton instance= null;
    
    private static Singleton(){}
    
    public static Singleton getInstance(){
        if(instance==null){
            instance = new Singleton();
        }
        return instence;       
    }
}
  • 这种模式只有在需要使用的时候才进行实例的初始化,在单线程下能够非常好的工作,但是在多线程下存在线程安全问题。
  • 优点:节约资源
  • 缺点:第一次加载时需要实例化,反应稍慢;多线程下不能正常工作

懒汉+线程安全单例

public class Singleton{
    private static Singleton instance =null;
    
    private static Singleton(){}
    
    public static synchronized getInstance(){
        if(instance==null){
            instance =new Singleton();
        }
        return instance;
    }
}
  • 这种模式为了解决多线程问题,采用了对函数进行同步的方式,但是比较浪费资源,因为每次都要进行同步检查,而实际中真正需要检查只是第一次实例化的时候。
  • 优点:在多线程下可以安全的使用
  • 缺点:造成不必要的同步开销

枚举单例

public enum Singleton{
    INSTANCE
}
  • 这种模式基本没人在用,知道就行。

双重校验锁单例(DCL)

public class Singleton{
    private static volatile Singleton instance=null;
    private static Singleton(){}
    public static Singleton getInstance(){
        if(instance==null){
            synchronized(Singleton.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}
  • 第一次判空是减少不必要的同步开销,也是对上面写法的改进;第二次判空是创建实例对象。注意这里使用了volatile关键字。
  • 这种模式既解决了资源浪费的问题,也解决了多线程的问题,建议使用。
  • 优点:资源利用率高,线程安全。
  • 缺点:第一次加载时反应稍慢,在高并发环境下有缺陷。

相关文章

  • 【Android必问面试题】手撸单例以及优缺点分析

    饿汉单例 在类被加载进入内存的时候就创建单一的instance对象,这种模式比较消耗内存资源。 优点:获取对象的速...

  • JAVA基础之单例

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

  • LayoutInflater源码分析

    在《(-)Android中的单例模式》分析中,我们分析了Android中单例模式的实现,且以LayoutInfla...

  • 单例设计模式

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

  • iOS swift创建单例(Singleton)

    由于需要封装一个数据的的单例,所以在网上搜索了创建单例的方法。具体的单例是什么?以及单例优缺点,在这里作为菜鸟的我...

  • Android面试题汇总

    面试题 单例模式实现方式,优缺点? 如何提升推送到达率? 如何减小Apk体积? 如何优化网络请求? ListVie...

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

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

  • 基础-单例模式

    单例模式总结-Python实现 面试里每次问设计模式,必问单例模式 来自《Python设计模式》(第2版) 1.理...

  • Android 深入理解单例模式

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

  • iOS 多线程面试题(使用dispatch_once实现单例)

    使用dispatch_once实现单例 热文推荐 2019 全网 iOS 面试题以及答案总结!

网友评论

    本文标题:【Android必问面试题】手撸单例以及优缺点分析

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