设计模式之单例模式

单例模式的代码

  • 饿汉式单例模式

    public class SingleCaseExample {
    
        public static SingleCaseExample singleCaseExample = new SingleCaseExample();
    
        private SingleCaseExample(){
            
        }
        
        public static SingleCaseExample getInstance(){
            return singleCaseExample;
        }
    
    }
    
  • 懒汉式非线程安全的单例模式

    public class SingleCaseExample {
    
        public static SingleCaseExample singleCaseExample;
    
        private SingleCaseExample(){
    
        }
    
        public static SingleCaseExample getInstance(){
            if(singleCaseExample == null){
                singleCaseExample = new SingleCaseExample();
            }
            return singleCaseExample;
        }
    
    }
    
  • 懒汉式线程安全的单例模式

    public class SingleCaseExample {
    
        public static volatile SingleCaseExample singleCaseExample;
    
        private SingleCaseExample(){
    
        }
    
        public static SingleCaseExample getInstance(){
            synchronized (SingleCaseExample.class){
                if(singleCaseExample == null){
                    singleCaseExample = new SingleCaseExample();
                }
            }
            return singleCaseExample;
        }
    
    }
    
  • 懒汉式双重判空线程安全的单例模式

    public class SingleCaseExample {
    
        public static volatile SingleCaseExample singleCaseExample;
    
        private SingleCaseExample(){
    
        }
    
        public static SingleCaseExample getInstance(){
            if(singleCaseExample == null){
                synchronized (SingleCaseExample.class){
                    if(singleCaseExample == null){
                        singleCaseExample = new SingleCaseExample();
                    }
                }
            }
            return singleCaseExample;
        }
    
    }
    
  • 静态内部类单例模式

    public class SingleCaseExample {
    
        private static class StaticSingleCaseExample{
            public static SingleCaseExample singleCaseExample = new SingleCaseExample();
        }
    
        private SingleCaseExample(){
    
        }
    
        public static SingleCaseExample getInstance(){
            return StaticSingleCaseExample.singleCaseExample;
        }
    
    }
    

优缺点及使用场景

  • 饿汉式单例模式

    • 优势:项目创建就会创建实例,随时可以使用该实例
    • 劣势:
      • 参数情况
        • 参数为空
        • 如果有参数,参数内容是固定的值
        • 如果有参数,参数是static修饰的属性
      • 如果该实例未使用,但依然占用内存
    • 使用场景:项目创建后,很快会用到的时候,参数设置为static或固定值
  • 懒汉式非线程安全的单例模式

    • 优势:
      • 当调用 getInstance() 方法后,才会创建实例,会节省内存
      • 可以使用有参的构造函数创建实例
    • 劣势:非线程安全的,多线程下可能会多次创建新的实例
    • 使用场景:确认是单线程,并且需要参数的情况下,可以使用该方式
  • 懒汉式线程安全的单例模式

    • 优势:
      • 当调用 getInstance() 方法后,才会创建实例,会节省内存
      • 可以使用有参的构造函数创建实例
      • 线程安全的,不会出现创建多个实例的情况
    • 劣势:每次执行 getInstance() 方法都需要获取锁,耗时比较多
    • 使用场景:不使用该方式
  • 懒汉式双重判空线程安全的单例模式

    • 优势:
      • 当调用 getInstance() 方法后,才会创建实例,会节省内存
      • 可以使用有参的构造函数创建实例
      • 外层判空,可以减少获取锁的时间,减少耗时
      • 内层判空,在线程安全的情况下,防止创建多个实例
    • 劣势:还是需要获取锁
    • 使用场景:多线程情况下,需要构造有参的实例,使用该方法
  • 静态内部类单例模式

    • 优势:
      • 当调用 getInstance() 方法后,才会创建实例,会节省内存
      • 根据 JVM 规则,会在调用静态内部类后创建实例,不需要锁的获取以及判空
      • 线程安全的,不会出现创建多个实例的情况
    • 劣势:
      • 参数情况
        • 参数为空
        • 如果有参数,参数内容是固定的值
        • 如果有参数,参数是static修饰的属性
    • 使用场景:构造无参实例的时候使用该方法或参数传入的值设置为static或为固定值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值