啥!单例模式还可以这样写!

本文通过一个面试场景,讲述了单例模式在Java中的实现方式及其潜在问题,包括饱汉式、饿汉式的缺陷,以及如何通过双重检验锁、静态内部类和枚举来优化单例模式。同时,提出了在多线程和反射环境下单例模式的挑战,引发读者对单例模式深入学习的兴趣。
摘要由CSDN通过智能技术生成
故事背景

故事发生在前几天,小张去某一家公司面试,事情的经过是这样的:

面试官问小张:你了解单例模式吗?
小张谦虚的说:当然,单例模式就是就是这个类我们只能创建一个对象,通常我们最好的办法是让类自身负责保存它唯一的一个实例,然后这个类可以保证没有其他实例可以被创建,并且它可以提供一个唯一的方法访问该实例

面试官:那这个类通常如何设计才能达到这种效果呢
小张:构造方法私有化这就堵死了外界通过new 创建该对象的可能;获取对象的时候可以判断下该对象是否存在,如果存在的话就创建一个实例,否则就返回当前已经存在的实例

面试官:嗯,很不错,那你在你面前的纸上写一写吧
小张心想:哼,又让我手写代码,写就写,这么低级的问题谁不会呢。。。

饱汉式
/**
 * 饱汉式
 */
public class SingletonTest01 {
   
    /**
     * 类负责保管的对象
     */
    private static SingletonTest01 singletonTest01;
    /**
     * 私有化构造方法,防止外界通过new 创建对象
     */
    private SingletonTest01(){
   
    }
    /**
     * 提供一个获取本实例的对外方法
     * @return SingletonTest01
     */
    public static SingletonTest01 getSingletonInstance(){
   
        if (null == singletonTest01){
   
            return new SingletonTest01();
        }
        return singletonTest01;
    }
}

小张信心满满的将上面代码提交给面试官,期待着面试官的称赞其敏捷扎实的基本功;不料,面试官眉头一皱,问到:你这个代码在多线程环境不一定是单例的吧

小张低头一看,果然 if语句存在竞态条件

为了避免眼前的尴尬,小张嘿嘿一笑说:还真是,我再改一版

/**
 * 饱汉式升级-01
 */
public class SingletonTest02 {
   
    /**
     * 类负责保管的对象
     */
    private static SingletonTest02 singletonTest02;
    /**
     * 私有化构造方法,防止外界通过new 创建对象
     */
    private SingletonTest02(){
   
    }
    /**
     * 提供一个获取本实例的对外方法
     * @return SingletonTest02
     */
    public static 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值