单例模式(饿汉、懒汉)高频面试考点

单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

饿汉模式(初始就直接创建好)

类加载的时候实例创建并初始化好了,所以是线程安全的。

//外界不能 new 这个类,所以用 static 来修饰字段和方法
//不允许在类外修改创建的实例,所以实例用 private 声明
public class Singleton {
    private Singleton(){}
    private static Singleton singleton=new Singleton();//直接创建好
    public static Singleton getInstance(){
        return singleton;
    }

懒汉模式(需要时再创建)双重检测保证线程安全

singleton = new Singleton();

该语句非原子操作,实际是三个步骤。

  • 1.给singleton分配内存;
  • 2.调用 Singleton 的构造函数来初始化成员变量;
  • 3.将给singleton对象指向分配的内存空间(此时singleton才不为null);

必须使用volatile保证执行顺序,比如三个步骤重排序后为1 3 2,这样第一个线程初始化对象到一半,第二个线程来发现已经不是null了就直接返回了 实际上该对象此时还没有完全初始化 可能会出现这个问题。

synchronized使用Singleton类的Class对象作为锁对象,当多个线程同时访问getInstance()方法时,只有一个线程能够进入同步代码块实例化Singleton类,保证了单例的唯一性。

public class Singleton {
    private Singleton(){}
    private static volatile Singleton singleton=null;
    public static Singleton getInstance(){
        if(singleton==null){//第一次判断是为了提升效率,先判断若不为null,锁也没必要抢,抢锁开销是很大的
            synchronized (Singleton.class){
                if(singleton==null){
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下 HR 会来跟你谈。” 我当时脑子直接宕机,一句话都没憋出来。后面 HR 找我谈话,直属领导也在旁边。HR 说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
3
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务