春招启动!吐血分享!腾讯一面实录: 请5min实现单例模式!

简介: 春招启动!吐血分享!腾讯一面实录: 请5min实现单例模式!

「面试官」: 嗨,我看你简历上对设计模式很熟悉啊。能聊聊单例模式吗?就跟我解释给个五岁小孩听似的。

「应聘者」: 哈哈,好的,那我就通俗点说。单例模式,就像我们班里只能有一个班长一样。无论发生什么,班长都是那个人,大家都知道找他就行了。

「面试官」: 听起来很实用。那你能给我举个实际开发中用到单例模式的例子吗?

「应聘者」: 当然。比如说,我们的应用要连接打印机。我们不可能让它每次打印都去连接一次打印机,那样太慢了。所以我们用单例模式创建一个打印管理器,它始终保持连接状态。这就像是我们随时都能打印,因为打印管理器始终在线。

「面试官」: 了解了。那实现单例模式有什么技巧?

「应聘者」: 实现它,关键得让这个类不能随便被创建多个实例。我们可以让构造函数私有,这就像是说'这个类的创建权我自己说了算'。然后提供一个公共的方法,比如叫getInstance,让大家通过这个方法来获取这个唯一的实例。

「面试官」: 有没有考虑过多线程的情况呢?

「应聘者」: 哦,肯定的。在多线程下,可能会有多个线程同时尝试创建实例,这时候就需要用到锁来确保只创建一个实例。这就像是大家排队进电影院,虽然大家都想第一个进去,但门口的工作人员确保一次只让一个人进。

「面试官」: 听起来不错。那能展示一下具体代码吗?

「应聘者」: 当然,这里有一个懒汉模式的单例实现:

public class Singleton {
    private static Singleton instance;
    private Singleton (){}

    public static Singleton getInstance() {
        if (instance == null) {  
            synchronized (Singleton.class) {  
                if (instance == null) {  
                    instance = new Singleton();  
                }
            }
        }
        return instance;
    }
}

「面试官」: 这个双重检查锁定是怎么一回事?能解释一下吗?

「应聘者」: 当然。这个机制是为了防止在多线程环境下创建多个实例。第一次检查是为了避免不必要的同步,也就是说,如果实例已经被创建,就不需要同步操作了。但如果还没有被创建,就需要进行同步,这就是第二次检查,确保在当前线程进入同步块之前,没有其他线程已经创建了实例。

「面试官」: 明白了。但我听说还有饿汉式的单例,那又是怎样的?

「应聘者」: 对,饿汉式和懒汉式不同的地方在于,它会在类加载的时候就立刻初始化实例,这样就不用担心多线程问题了。可以这样写:

public class SingleObject {

   private static SingleObject instance = new SingleObject();

   private SingleObject(){}

   public static SingleObject getInstance(){
      return instance;
   }
}

「面试官」: 听起来好像饿汉式比懒汉式更简单、更安全啊。

「应聘者」: 确实,在某些情况下是这样的。但饿汉式也有它的缺点,比如它在类加载时就创建了实例,即使我们可能根本就用不到这个实例,也会占用内存资源。所以选择哪种方式,还得看具体的场景和需求。

面试官」: 有没有哪种方法是最好的实践呢?

「应聘者」: 在Java中,我觉得最好的做法是用枚举来实现单例。它不仅能避免多线程同步的问题,还能抵抗反射攻击和避免序列化的问题。这样写:

public enum EasySingleton {
    INSTANCE;
    public void show(){
        System.out.println("Hello, Singleton!");
    }
}

「面试官」: 哇,这个我还真不知道,学到了。感谢你的分享。那你有没有遇到过什么特别需要单例模式的情况?有没有哪次特别难忘?

「应聘者」: 有的。我曾在一个大型的应用程序中工作,那里有一个配置管理器,控制着所有的系统配置。我们使用了单例模式,确保整个应用中数据的一致性,并且避免了不必要的资源浪费。那次经历让我深刻体会到了单例模式的强大之处,也让我对设计模式有了更深的理解。

「面试官」: 真不错,这确实是单例模式的一个经典用例。谢谢你今天的分享,你回答得很棒。我们很快会和你联系的。

「应聘者」: 谢谢您!期待能有机会和贵公司合作。







相关文章
火爆Boss直聘的百页SpringBoot原理实战+面试题助你狂拿千份offer
近期,有个小伙伴出去面试老找不到工作,在面试的过程中问到了好多知识点都不会,都是一知半解,啪啪被打脸,还是工作3年开发的程序员。 结果,经过询问,才知道做了三年的开发,天天都是CRUD,按部就班,从来没有想过去提升自己的技术,也不愿意跳槽,就一直温水煮青蛙,不成想被裁掉了。 被裁掉之后,他就想着去面试一下吧!反正有三年工作经验在手,怕什么?于是,四处碰壁,加上java比较卷,大环境又不好,公司招聘要求又高,又到了年底,就迟迟找不到工作。
|
8月前
|
SQL 安全 前端开发
这部SpringBoot实战派早已刷爆国内外一线大厂!面试稳了!
近年来,Spring Boot 是整个Java社区中最有影响力的项目之一,常常被人看作是Java EE( Java Platform Enterprise Edition )开发的颠覆者,它将逐渐替代传统SSM ( Java EE互联网轻量级框架整合开发——Spring MvC+Spring+MyBatis)架构。
牛皮!仅凭“阿里爸爸”大厂面试参考笔记,去携程Java三面,已OC
今天来分享一位读者携程校招 Java 岗位的面经。 下面是正文。 个人背景:双非本,机械专业转码。 携程在正式面试之前,会有一个性格测试(40分钟)。性格测试之后,大概过一周进行笔试。笔试之后,会邮件通知是否通过并预约第一轮面试时间。 普通 offer 一般只有两面,如果是 sp 或者 ssp 的话,技术面貌似是三面。 携程的面试难度一般,效率比较高,面试体验还是不错的。
|
Java 程序员
凭借百度/乐信/腾讯面试模板+Alibaba成神手册顺利拿下年薪80w
最近收到好多小伙伴的反馈,都说今年的大厂比以往更加严格了,其实并不然,如果你也是这样想,那么我在这里奉劝大家一句话:把这些负面情绪快速抛开,好好准备明年的春招才是正事!
|
设计模式 算法 架构师
YYDS!由浅入深学习阿里JDK源码,已在阿里内部疯拿3个金奖
大家好,又是我你们不知道喜不喜爱的架构师之道,今天呢,我想和大家聊一聊JDK源码的问题: * **为什么要看JDK源码** * **JDK源码的阅读顺序** * **JDK源码的最佳学习方法**
152 0
YYDS!由浅入深学习阿里JDK源码,已在阿里内部疯拿3个金奖
|
消息中间件 缓存 NoSQL
【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
|
消息中间件 SpringCloudAlibaba Java
经久不衰!阿里P8私传“金九银十面试”突击手册下载秒破万
程序员的发展,在于横向与纵向的打磨。一个逐渐走向成熟的程序员,是在可以不断精炼自己写CRUD能力的同时,还能主动追求技术拓展。
396 0
|
Web App开发 存储 缓存
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
137 0
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
|
存储 SQL 缓存
2021-Java后端工程师面试指南-(MySQL)|牛气冲天新年征文
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
141 0
|
设计模式 算法 网络协议
凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer(1)
凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
182 0
凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer(1)