zoukankan      html  css  js  c++  java
  • 「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;
        }
    }
  • 相关阅读:
    Java Android程序员软件开发知识:枚举的介绍,以及代码的编写教程。
    Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)
    Android(java)开发之将double类型,强制保留到小数点后两位解决方法。
    Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送
    Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。
    输入流、输出流
    关键字和继承
    java集合
    SpringMVC框架拦截器
    SpringMVC框架基础
  • 原文地址:https://www.cnblogs.com/duan-xue-bin/p/9290548.html
Copyright © 2011-2022 走看看