Java面试——单例模式(5种写法、可能存在的问题)

4 篇文章 0 订阅

设计模式

单例模式

定义:一个类只有一个实例

构造方法私有,提供一个静态的成员变量,提供公共静态方法访问

分类

  • 饿汉式:一开始就生成实例

  • 懒汉式:需要时才生成实例

  • 实现方式:

    • 饿汉式

    • 枚举饿汉式

    • 懒汉式

    • 双检锁懒汉式

    • 静态内部类懒汉式

破坏单例:反射破坏单例、反序列化破坏单例(单例实现了序列化接口)、Unsafe破坏单例

  • 反射破坏原理:获取单例的类名,用反射机制强行访问构造方法,生成新的对象。

  • 防止反射破坏:在构造方法中判断是否已经生成实例,如有则抛出异常。

反序列化破坏:

在这里插入图片描述

  • 防止:写一个特殊方法 readResolve

    public Object readResolve(){
        //返回本来已有的实例
        return INSTANCE;
    }
    
  • 枚举类单例可以防止反射破坏、反序列化破坏

  • 懒汉式:

在这里插入图片描述

  • 懒汉式多线程时会有问题

  • 解决(双检锁):[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t4E93wR7-1663423712670)(C:\Users\86133\AppData\Roaming\Typora\typora-user-images\image-20220916105853057.png)]

    • volatile:保证数据的可见性、有序性
    • 如果没有volatile,指令会重排序,可能会返回构造未完全的实例。
  • 懒汉式——静态内部类:

  • 不用考虑线程安全问题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uk71kvX1-1663423712670)(C:\Users\86133\AppData\Roaming\Typora\typora-user-images\image-20220916111405120.png)]

  • jdk中哪里使用了单例

    • Runtime类(exit方法退出虚拟机、gc方法)
    • System类中的Consolo(控制台)(双检锁懒汉式)
    • Collections类(集合工具类)——Empt开头的类一般都是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值