常用23种设计模式之-单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。文章介绍了JAVA中实现单例的五种方法:饿汉式(预先创建对象,线程安全但占用内存)、懒汉式(延迟加载,可能有线程安全问题)、双重检查锁定模式(线程安全,延迟加载,需处理指令重排序)、静态内部类模式(延迟加载,线程安全,无需额外锁)和枚举模式(天然线程安全,推荐使用)。
摘要由CSDN通过智能技术生成

单例模式简单总结

        简单的概念:通过单例模式的方法创建的类,在一个进程中仅有一个对象,这一个模式的目的是使得一个类的实例对象在系统中仅有一个,因此需要用一种只允许生成对象类的唯一实例的机制

     单例模式在JAVA实现的方法大概有以下5种方式

1、饿汉式

      饿汉式优点:一个类只能加载一次,线程安全,在加载时提前创建好对象,调用时反应快

      饿汉式缺点:对象提前创建好,需要占用内存

2、懒汉式

     懒汉式优点:在第一次调用getInstance()时,才进行对象初始化,如不需要则不创建,节省内存空间

    懒汉式缺点:第一次掉用时,需要创建对象,响应速度慢,有线程安全的风险,并发的情况下有可能创建多个实例

3、双重检查锁定模式

     双重检查锁定模式优点:安全,在多线程情况下保证线程安全,且不会提前创建对象,第一个if避免了所有线程都去抢占锁,提高了并发效率,第二个再次判断对象是否为空,防止抢占到锁之后已经有其他对象成功创建了对象

     双重检查锁定模式缺点:由于JVM执行程序时,会对字节码指令进行优化,导致发生指令重排序,有可能会出现对象不存在但是 singleton !=null的情况下,返回了错误对象,需要加volatile指令防止重排序 

    Singleton singleton = new Singleton() 其实包含了三个步骤

    1.给 Singleton实例对象分配内存空间;

    2.调用 Singleton 的构造函数进行初始化;

    3.将创建的对象所在地址指向局部变量singleton

    正常的执行顺序是 123,那么就没有问题,有时候会发生指令重排序 执行顺序变成132.那么就会发生我上面所说的对象不存在但是 singleton !=null 的情况发生

4、静态内部类模式

     静态内部类模式优点:

       支持延迟加载,外部类被加载时,不会加载内部类

       根据一个类只能加载一次特性,是线程安全的

       不需要加锁

   静态内部类模式缺点:需要多维护一个类,就需要多加载一个类,浪费内存

5、枚举模式(推荐使用)

        优点:单项的枚举模式是一个天然的单例模式,实现简单,是一个真正的单例模式(不可以通过反射生成其他实例,其他模式都可以通过反射生成额外的实例),线程安全

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值