• 单例模式的记录


    lazy loading(懒加载):意思就是不在类加载的时候不初始化,而是在调用方法的时候初始化。

    1、懒汉式(线程不安全)

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

    优点:lazy loading

    缺点:多线程下不能工作。


    2、懒汉式(线程安全)

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

    这种仅仅在在第一种的基础上给getInstance( )加了一把锁。

    优点:lazy loading,线程安全

    缺点:效率低下


    3、双重校验的方式

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

    优点:线程安全,效率上相对2来说高一点,lazy loading

    缺点:效率上还是不高


    4、饿汉式

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

    优点:让instance在类加载的时候初始化,由于静态变量只会在类加载的时候初始化一次,从而避免多线程初始化的情况。

    缺点:在类加载的时候就会实例话,所以不是lazy loading,

    5、静态内部类

        public class Singleton {
            private static class SingletonHolder{
                private static final Singleton INSTANCE = new Singleton();
            }
            private Singleton (){}
         
            public static Singleton getInstance() {
                return SingletonHolder.INSTANCE;
            }
        }

    优点:由于静态内部类跟外部类是平级的,所以外部类加载的时候不会影响内部类,因此实现了lazy loading;同时也是利用静态变量的方式,使得INSTANCE只会在SingletonHolder加载的时候初始化一次,从而保证不会有多线程初始化的情况,因此也是线程安全的。

    这个也是最合理最常规的实现单例模式的方式,推荐。

    6、枚举

        public enum Singleton{
            INSTANCE;
            public void whateverMerhod() {
                
            }
        }

    这种是实现单例模式不太常规但是很合理的方式。

  • 相关阅读:
    ubuntu12.04 安装eclipse
    loj 1429(可相交的最小路径覆盖)
    loj 1406(状态压缩)
    mysql数据库表插入单条数据/批量插入数据
    window7安装MongoDB详细步骤
    django中的setting全局变量的导入
    django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)
    DjangoDRF序列化组件使用
    python并发编程知识点总结
    协程+IO切换实现并发
  • 原文地址:https://www.cnblogs.com/zhanghao1799/p/10831967.html
Copyright © 2020-2023  润新知