小白成长记——Android进阶之设计模式之单例模式

本文详细介绍了单例模式的概念及其四种实现方式:饿汉式、懒汉式、DCL式及静态内部类方式,并分析了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式可以说是设计模式中最简单,也是应用最广泛的设计模式,所以很有必要学习一下

所谓单例模式,就是确保某一个类只有一个实例,而且能够自行实例化并向整个系统提供这个实例的设计模式。一般用于避免产生多个对象消耗过多的资源或者某种类型的对象必须独一无二的场景。

具体实现方式:

1).饿汉式

所谓饿汉式就是在声明对象的时候直接对其进行初始化

注意修饰符的使用

public class Single {
    private static final Single single = new Single();

    private Single() {
        
    }

    public static Single getInstance() {
        return single;
    }
}

从代码中可以看出,我们不能通过正常的new形式的构造方法构造对象,只能通过类中提供的getInstance方法获取唯一静态对象

2).懒汉式

懒汉式与饿汉式不同的是它只有在第一次调用getInstance方法的时候才进行初始化

public class Single {
    private static Single single = null;

    private Single() {

    }

    public static synchronized Single getInstance() {
        if (single == null) {
            single = new Single();
        }
        return single;
    }
}

我们可以看到代码中使用了synchronized关键字来修饰getInstance方法,synchronized关键字的主要作用是给方法加锁,当我在一个线程中调用刚该方法的时候回去检查其他线程中有没有调用该方法,如果有就等待,因此可以确保在多线程的情况下单例对象的独一无二性。

但是在第一次调用时进行初始化会拖慢速度,并且每次调用都会进行同步,会消耗不必要的资源,因此懒汉式并不是很好

3).DCL式

Double Check Lock双重检测锁,既实现了在需要的时候才初始化对象,又可以保证线程安全

public class Single {
    private volatile static Single single = null;

    private Single() {

    }

    public static Single getInstance() {
        if (single == null) {
            synchronized (Single.class) {
                if (single == null) {
                    single = new Single();
                }
            }
        }
        return single;
    }
}

通过双重锁的检测我们不仅可以确保多线程下对象独一无二,还避免了每次调用都会进行同步的问题,除了第一次初始化之外,每次调用geInstance方法进入第一个if判断就可以返回一个single对象。
4).静态内部类

一种更完美的单例模式实现方式

public class Single {

    private Single() {
    }

    /**
     * 类级的内部类,也就是静态类的成员式内部类,该内部类的实例与外部类的实例
     * 没有绑定关系,而且只有被调用时才会装载,从而实现了延迟加载
     */
    private static class SingletonHolder {
        // 静态初始化器,由JVM来保证线程安全
        private static final Single instance = new Single();
    }

    public static Single getInstance() {
        return SingletonHolder.instance;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值