单列模式

来源:互联网 发布:淘宝评价回复感谢语 编辑:程序博客网 时间:2024/05/23 15:40
懒汉式:
    public class SingletonClass{
        private static SingletonClass mSingletonClass;
        private Singleton(){}
        
        public static SingletonClass getInstance(){
            if(mSingletonClass == null){
                mSingletonClass = new SingletonClass();
            }
            return mSingletonClass;
        }
    }

饿汉式:
    public class SingletonClass{
        private static SingletonClass mSingletonClass = new SingletonClass();
        
        private SingletonClass(){}
        
        public static SingletonClass getInstance(){
            return mSingletonClass;
        }
    }
    
上面的单列模式并不是完美的,通过反射可以创建不同的实例(通过获取类的构造器,来进行实例化),所以得改一改

    public class SingletonClass{
        private static SingletonClass mSingletonClass;
        private Singleton(){
            if (mSingletonClass != null){
                throw new RuntimeException("error");
            }

        }
        
        public static SingletonClass getInstance(){
            if(mSingletonClass == null){
                mSingletonClass = new SingletonClass();
            }
            return mSingletonClass;
        }
    }
    
如果俩个线程同时初始化单列类,有可能会创建不同的实例
    
    public class SingletonClass{
        //这里使用volatile关键字才能保证线程的安全,如果只是单纯的同步的话,
        //可能在类正在初始化未完成时应用它
        private static volatile SingletonClass mSingletonClass;
        private Singleton(){
            if (mSingletonClass != null){
                throw new RuntimeException("error");
            }
        }
        //也可以对此方法进行同步,不过会有额外开销
        public static SingletonClass getInstance(){
            俩次检查,并且是在单列类为空时才进行同步创建
            if(mSingletonClass == null){
                synchronized(SingletonClass.Class){
                    if(mSingletonClass == null){
                        mSingletonClass = new SingletonClass();
                    }
                }

            }    
            return mSingletonClass;
        }

    }


还有一种保证线程安全的单列方法:
    public class SingletonClass{
        private Singleton(){
        }
        public static SingletonClass getInstance(){    
            return SingletonHolder.sInstance;
        }
        
        //静态内部类
        private static class SingletonHolder{
            private static final Singleton sInstance = new SingletonClass();
        }
    }

    
最后啦,让单列序列化安全
    public class SingletonClass{
        
        private static volatile SingletonClass mSingletonClass;
        private Singleton(){
            if (mSingletonClass != null){
                throw new RuntimeException("error");
            }
        }
        
        public static SingletonClass getInstance(){
            if(mSingletonClass == null){
                synchronized(SingletonClass.Class){
                    if(mSingletonClass == null){
                        mSingletonClass = new SingletonClass();
                    }
                }
            }    
            return mSingletonClass;
        }
        
        protected SingletonClass readResolve(){
            return getInstance();
        }

    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车子没油了怎么办 遇到买家不退款怎么办 苹果多次退款后怎么办 饿了么送错单了怎么办 支付宝退款失败怎么办 充话费总是退款怎么办 月初流量不能用怎么办 微信充值话费退款失败怎么办 ios邮件退款失败怎么办 信用卡充了钱怎么办 ios退款被拒绝怎么办 话费缴错了怎么办 网上缴费交错了怎么办 别人给交错话费怎么办 联通流量不到账怎么办 卖家拒绝退款怎么办? 淘宝退款后红包怎么办 手机不能吃鸡怎么办? 在国外手机软件好多不支持怎么办 淘宝店拒绝退款怎么办 app没有退款资格怎么办 手机无法计步怎么办 抖音机型不支持怎么办 用nfc不支持卡片怎么办 移动怎么办省内流量包 手机交不了话费怎么办 淘宝快递不签收怎么办 快递买家不签收怎么办 淘宝退货未收货怎么办 淘宝退衣服运费怎么办 手机流量不到账怎么办 淘宝水果坏了怎么办 用微信充值话费充成空号了怎么办 苹果id被拉黑了怎么办 苹果app不退款怎么办 合同退款不退怎么办 微信充值q币被骗怎么办 小米手机存储空间不够怎么办 小米mix2s存储空间不够怎么办 进货一直没发票怎么办 魅蓝note5卡怎么办