• 01 单例模式


    单例模式

    • 保证某个类只存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

    以下模式斜体为推荐使用

    • JDK中,java.lang.Runtime就是经典的单例模式(饿汉式)
    • 使用场景:需要频繁的进行创建和销毁对象,创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、平凡访问数据库或文件的对象(如数据源、session工厂等)
    1 饿汉式(静态变量)

    实现步骤:

    • 构造器私有化
    • 类的内部创建对象
    • 向外暴露一个静态公共方法
    • 代码实现

    优缺点:

    • 写法简单,在类加载的时候即完成了实例化,避免了线程同步问题。
    • 没有达到Lazy Loading效果,可能会造成内存浪费。
    2 饿汉式(静态代码块)

    本质同上

    3 懒汉式(线程不安全)

    代码实现:

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

    优缺点:

    • 起到了lazy loading效果,但只能在单线程下使用
    • 实际开发不推荐使用
    4 懒汉式(线程安全,同步方法)

    代码实现:

    class Singleton{
        private static Singleton instance;
        
        private Singleton(){}
        //在方法上加了synchronized
        public static synchronized Singleton getInstance(){
            if(instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    

    优缺点:

    • 效率太低
    • 不推荐使用
    5 懒汉式(线程安全,同步代码块)
    class Singleton{
        private static Singleton instance;
        
        private Singleton(){}
      
        public static Singleton getInstance(){
            if(instance == null){
                synchronized(Singleton.class){
                    instance = new Singleton();
                }   
            }
            return instance;
        }
    }
    

    不推荐使用

    6 双重检查

    代码实现:

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

    优缺点:

    • 线程安全
    • 延迟加载
    • 推荐使用
    7 静态内部类

    代码实现:

    class Singleton{
        private static volatile Singleton instance;
        
        private Singleton(){}
      	
        private static class SingletonInstance{
            private static final Singleton INSTANCE = new Singleton();
        }
        public static synchronized Singleton getInstance(){
        	return SingletonInstance.INSTANCE;
        }
    }
    

    静态内部类特点:

    • 加载外部类时,内部类不会自动加载,只有使用到内部类的时候内部类才会加载。

    优缺点:

    • 懒加载
    • 线程安全
    • 推荐使用
    8 枚举

    代码实现:

    enum Singleton{
        INSTANCE; //属性
        public void sayOK(){
            System.out.println("ok~");
        }
    }
    

    优缺点:

    • 借助枚举实现单例模式,不仅能避免多线程同步问题,而且还能放置反序列化重新创建新的对象
    • 推荐使用
  • 相关阅读:
    Java集合框架:Collections工具类
    百度编辑器多图上传返回图片绝对路径问题
    iOS开发中“此证书的签发者无效”的解决方式
    codeblocks如何watch指针
    codeblocks如何watch数组
    printf不支持%lf
    doxygen可以生成C/C++代码的文档(根据注释)
    codeblocks中右键源文件没有Rename选项?
    codeblocks中给GCC编译器加参数
    codeblocks设置当前行高亮
  • 原文地址:https://www.cnblogs.com/nojacky/p/13916715.html
Copyright © 2020-2023  润新知