关于Android单例模式

单例模式在android开发中使用非常频繁,我们经常会在某个类中需要获取当前的Application对象,或者是之前创建的某个Activity等,单例模式提供了方便快速的获取方法,而且避免了重复创建对象实例而引起的其他错误。单例模式通常有以下四种方式:

1.饿汉模式(好奇怪的名字)

public class MyClass {

    private static final MyClass mInstance = new MyClass();

    private MyClass(){}

    public static MyClass getInstance(){

        return mInstance;

    }

}

关键点:a.构造函数私有,使得外部不能随意创建对象 b.用私有的静态变量来存储创建的实例c.用公共的静态方法返回该实例

2.懒汉模式

public class MyClass{

    private static MyClass mInstance;

    private MyClass(){}

    public static synchronized MyClass getInstance(){

        if(mInstance == null){

            mInstance = new MyClass();

        }

        return mInstance;

    }

}

这种方法与上一种的差异是添加了synchronized关键字,并且在必要的时候才创建对象实例。其实synchronized关键字的主要用途是在多线程的情况下,对代码块进行保护,因为多个线程同时对某个对象实例进行修改,会产生错误。该关键字主要是用来  简化之前的Lock/Condition方式,然而官方不建议采用这样的方式来处理加锁,而是java.util.concurrent包中的阻塞队列。该方法每次都要进行同步,也是浪费资源的。

3.二重检查锁模式

public class MyClass{

    private static MyClass mInstance = null;

    private MyClass(){}

    public static MyClass getInstance(){

        if(mInstance == null){

            synchronized(MyClass.class){

                if(mInstance == null){

                    mInstance = new MyClass();

                }

            }

        }

        return mInstance;

    }

}

这种方法只在首次创建对象实例的时候才同步锁,比上一种方法更高效一些。

4.采用静态内部类

public class MyClass{

    private MyClass(){}

    public static MyClass getInstance(){

        return MyInnerClass.mInstance;

    }

    private static class MyInnerClass{

         private static final MyClass mInstance = new MyClass();   

    }

}

这种方法只在调用getInstance()方法的时候才初始化对象实例,而且线程安全。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值