关于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()方法的时候才初始化对象实例,而且线程安全。

阅读更多
上一篇Android自定义view的主要函数的调用流程
下一篇关于Activity的lunchMode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭