zoukankan      html  css  js  c++  java
  • 单例模式

    最近面试问别人单例模式,结果发现自己对单例模式也是一知半解  所以这边记录一下

        单例模式     简单来说的意思就是   我们使用的对象及实例化  都是同一对象

        引用另一个文章的代码http://www.importnew.com/18872.html

    饿汉模式

        

    public class Singleton {   
        private static Singleton = new Singleton();
        private Singleton() {}
        public static getSignleton(){
            return singleton;
        }
    }

    这种做法不的缺点是:我们第一次实例化该单例的时候   不管我们是否需要  他都会new  一个对象给我们

    加入延时加载 懒汉模式

      

    public class Singleton {
        private static Singleton singleton = null;
        private Singleton(){}
        public static Singleton getSingleton() {
            if(singleton == null) singleton = new Singleton();
            return singleton;
        }
    }

    但是这种方法  是线程不安全的的

    加锁

      

    public class Singleton {
        private static volatile Singleton singleton = null;
    
        private Singleton(){}
    
        public static Singleton getSingleton(){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
            return singleton;
        }    
    }

    这种做法的话 效率又太低    

    volatile    修饰符可以看这篇文章http://www.importnew.com/24082.html

    加入双重锁

      

    public class Singleton {
        private static volatile Singleton singleton = null;
    
        private Singleton(){}
    
        public static Singleton getSingleton(){
            if(singleton == null){
                synchronized (Singleton.class){
                    if(singleton == null){
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }    
    }

    内部静态类

      

    public class Singleton {
        private static class Holder {
            private static Singleton singleton = new Singleton();
        }
    
        private Singleton(){}
    
        public static Singleton getSingleton(){
            return Holder.singleton;
        }
    }

    枚举写法

    public enum Singleton {
        INSTANCE;
        private String name;
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
    }
    
  • 相关阅读:
    RecyclerView与各种异步图片加载框架不兼容的问题
    课内上机实验3——括号匹配(栈)
    课内上机实验3——删除重复元素
    课内上机实验3——数组内移动0元素至末尾
    课内上机实验3——M集合问题(队列)
    递归实践1——Cnm组合数计算
    【转】Quine的编写
    【转】fork函数详解
    【转】Makefile详解
    VC++6.0程序安装
  • 原文地址:https://www.cnblogs.com/liaohongbin/p/8807528.html
Copyright © 2011-2022 走看看