「Android」单例的五种写法

单例

发现博客园可以很好的设置自己的博客文章的展示,很开心,然后特此发一篇

其实这几种写法大家应该都会的,就权当拿来记录一下吧,以后复习巩固也比较方便。 
这篇文章中的代码,来自一篇视频(我想找视频贴上,但我没找到,以后有机会看到再贴吧,实不好意思),上面有讲到,我觉得很好,择录了一些下来。

1.

//懒人写法|原始
//缺点:类加载的时候就初始化实例,会拖慢应用启动速度
public class PlainOldSingleton {
    private static PlainOldSingleton INSTANCE = new PlainOldSingleton();
    private PlainOldSingleton(){}
    public static PlainOldSingleton getInstance(){
        return INSTANCE;
    }
}

  

2.

//懒加载
//缺点:不是线程安全的,有可能线程A和线程B来同时访问INSTANCE的话,会new出两个实例,如果有多个线程的话,就会new出多个实例
public class LazyNotThreadSafe{
    private static LazyNotThreadSafe INSTANCE;
    private LazyNotThreadSafe(){}
    public static LazyNotThreadSafe getInstance(){
        if(INSTANCE == null){
            INSTANCE = new LazyNotThreadSafe();
        }
        return INSTANCE;
    }
}

  

3.

//同步锁
//缺点:每次获取都会加锁,会有一定的性能开销
//优点:线程安全
public class LazyThreadSafeSynchronized{
    private static LazyThreadSafeSynchronized INSTANCE;
    private LazyThreadSafeSynchronized(){}
    public static synchronized LazyThreadSafeSynchronized getInstance(){
        if(INSTANCE == null){
            INSTANCE = new LazyThreadSafeSynchronized();
        }
        return INSTANCE;
    }
}

  

4.

//双重验证
//面试多考,volatile是java1.5之后的一个内容,要理解这个需要懂Java虚拟机
public class LazyThreadSafeDoubleCheck{
    private static voltatile LazyThreadSafeDoubleCheck INSTANCE;
    private LazyThreadSafeDoubleCheck(){}
    public static LazyThreadSafeDoubleCheck getInstance(){
        if(INSTANCE == null){
            synchronized (LazyThreadSafeDoubleCheck.class){
                if(INSTANCE == null){
                    INSTANCE = new LazyThreadSafeDoubleCheck();
                }
            }
        }
        return INSTANCE;
    }
}

  

5.

//静态内部类
//优雅,实现了懒加载和线程安全,线程安全利用了虚拟机的机制
public class LazyThreadSafeStaticInnerClass{
    private static class Holder{
        private static LazyThreadSafeStaticInnerClass INSTANCE == new LazyThreadSafeStaticInnerClass();
    }
    private LazyThreadSafeStaticInnerClass(){}
    public static LazyThreadSafeStaticInnerClass getInstance(){
        return Holder.INSTANCE;
    }
}

  

猜你喜欢

转载自www.cnblogs.com/duan-xue-bin/p/9290548.html