• 单例模式的几种实现-Java版


    关键点

    1. 私有化构造器
    2. 通过静态方法或枚举返回单例类对象
    3. 确保单例类对象只有一个,尤其在多线程环境下。
    4. 确保每个类被序列化不会重新创建对象

    饿汉式

    /*
    饿汉式
     */
    public class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton(){};
        public static Singleton getInstance() {
            return instance;
        }
    }
    

    懒汉式

    懒汉式缺点:
    第一次加载需要及时进行实例化,反应稍慢
    每次调用getInstance都会进行同步,造成不必要的同步开销

     /*
     懒汉式
      */
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){};
        public static synchronized Singleton getInstance() {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    

    双检锁

      /*
      双检索 CAS
       */
    
    public class Singleton {
        private static volatile Singleton instance = null;
        private Singleton(){};
        public static Singleton getInstance() {
            if ( instance == null ) {
                synchronized (Singleton.class) {
                    if (instance == null)
                        instance = new Singleton();
                }
            }
    
            return instance;
        }
    }
    

    静态内部类单例模式

    优点:

    第一次加载Singleton类并不会初始化instance,只有在第一次调用getInstance
    方法时才会导致instance被初始化(延迟加载)。这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性(利用Classloader的特性),同时也延迟了单例的实例化,所> 以这是推荐使用的单例模式实现方式。

    //静态内部类单例模式
    public class Singleton {
        private Singleton(){};
        public static Singleton getInstance() {
            return SingletonHolder.instance;
        }
    
        private static class SingletonHolder {
            private static final Singleton instance = new Singleton();
        }
    }
    

    枚举方式

    public enum Singleton {
        INSTANCE;
    }
    //==========完整代码===
    // 定义单例模式中需要完成的代码逻辑
    public interface MySingleton {
        void doSomething();
    }
    
    public enum Singleton implements MySingleton {
        INSTANCE {
            @Override
            public void doSomething() {
                System.out.println("complete singleton");
            }
        };
    
        public static MySingleton getInstance() {
            return Singleton.INSTANCE;
        }
    }
    
  • 相关阅读:
    模板语法
    django框架中登陆验证功能
    __call__
    JQuery基础
    JS中BOM和DOM操作
    Javascript基础
    css完结
    css深入
    css初识
    html深入解析
  • 原文地址:https://www.cnblogs.com/johnleo/p/singleton_design.html
Copyright © 2020-2023  润新知