美文网首页
java单例的实现方式

java单例的实现方式

作者: 二十三岁的梦 | 来源:发表于2018-05-23 11:52 被阅读0次

    饿汉模式

    //普通员工
    public class Staff {
        public void work() {
            //干活
        }
    }
    
    //副总裁
    public class VP extends Staff {
        @Override
        public void work() {
            //管理下面的经理
        }
    }
    
    //CEO,饿汉单例模式
    public class CEO extends Staff {
        private static final CEO mCeo = new CEO();
        //构造函数私有
        private CEO() {
        }
        //共有的静态函数,对外暴露获取单例对象的接口
        public static CEO getCeo(){
            return mCeo;
        }
    
        @Override
        public void work(){
            //管理VP
        }
    }
    

    CEO类不能通过new的形式构造对象,只能通过CEO.getCEO()函数获取,而这个CEO对象是静态对象,并且在声明的时候就已经初始化了,这就保证了CEO对象的唯一性。

    懒汉模式

    懒汉模式是声明一个静态对象,并且在用户第一次调用getInstance时进行初始化,而上述的饿汉模式是在声明静态对象时就已经初始化。

    public class Singleton {
        private static Singleton instance;
        private Singleton (){
        }
        public static synchronized Singleton getInstance(){
            if (instance == null){
                instance=new Singleton();
            }
            return instance;
        }
    }
    

    懒汉模式下,getInstance()方法中添加了synchronized关键字,使得getInstance()成为一个同步方法,这就保证单例对象在多线程情况下的唯一性。
    缺点:第一次加载时需要及时进行实例化,反应稍慢,最大的问题是每次调用getInstance()都进行同步,造成不必要的同步开销。一般不建议使用。

    Double Check Lock (DCL) 实现单例

    public class Singleton {
        private static Singleton mInstance=null;
        private Singleton(){
        }
        public void doSomething(){
            System.out.println("do sth.");
        }
        public static Singleton getInstance(){
            if(mInstance==null){
                synchronized (Singleton.class){
                    if(mInstance==null){
                        mInstance=new Singleton();
                    }
                }
            }
            return mInstance;
        }
    }
    

    静态内部类单例模式

    public class Singleton {
        private Singleton() { }
        public static Singleton getInstance() {
            return SingletonHolder.sInstance;
        }
        /**
        *  静态内部类
        */
        private static class SingletonHolder {
            private static final Singleton sInstance = new Singleton();
        }
    }
    
    推荐使用静态内部类方法实现单例

    枚举单例

    public enum SingletonEnum {
        INSTANCE;
        public void doSomething(){
            System.out.println(" do sth.");
        }
    }
    

    使用容器实现单例

    public class SingletonManager {
        private static Map<String,Object> objMap = new HashMap<String,Object>();
        private SingletonManager() { }
        public static void registerService(String key,Object instance) {
            if (!objMap.containsKey(key)){
                objMap.put(key,instance);
            }
        }
        public static Object getService(String key) {
            return objMap.get(key);
        }
    }
    

    相关文章

      网友评论

          本文标题:java单例的实现方式

          本文链接:https://www.haomeiwen.com/subject/asnljftx.html