春招启动!吐血分享!腾讯一面实录: 请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!");
    }
}

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

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

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

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







相关文章
|
5月前
|
消息中间件 Dubbo Java
24年国内头条最牛的Java面试八股文1000集,不接受反驳!
年后这个时间段, 找工作面试不要停!! 很多朋友据我了解,技术水平和工作经验都很不错,但是面试频频败北。 大家复盘下来发现问题不严重,但是很普遍,10个人里面8个都存在,那就是面试前不做准备。 技巧和避坑先不论,面试题型就不熟悉,没有系统过下大厂真题和必问项目,真正对线上面试官时被打的措手不及。 想要从容应对,就要提前建立把握和自信,这不但来自自身的技术能力水平,更来源于对面试时将要发生的各种情况有预判,做到心中有数。 这里整理了一套跳槽涨薪大厂Java知识点解析及面试题解析,涵盖20个技术栈的大厂面试题及详解文档,各大厂技术重点、面试难点、进阶要点,帮助大家“临阵磨枪”,如有需要的
|
5月前
|
缓存 算法 NoSQL
凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer
近两年是中国互联网企业组织架构升级的大年,阿里、腾讯、小米、快手等知名互联网企业都进行了相应调整。2020年3月12日,字节跳动成立八周年之际,宣布组织全面升级,而这一消息也彻底激起了我对字节跳动的期待。
|
5月前
|
NoSQL Dubbo Java
网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer
不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试:
|
5月前
|
算法 网络协议 Java
备战春招狂刷这份大厂级24W字java面试手册2个月可成功逆袭上岸!
前言 2023年金九银十程序员跳槽或者找工作并不理想,迟迟找不到工作,甚至大厂还进行几轮裁员,导致整个就业市场都不是太好! 出现这种情况是因为中美贸易战,导致大环境不好、大厂裁员、就业情况差、企业要求变高、各行各业越来越卷,尤其是程序员,处于这个阶段,感觉特别明显! 对于程序员这个群体来说,java程序员的占比就非常之高,就业市场等于说是千军万马过独木桥,简直可以说是太难了!卷不过、根本卷不过! 在这里想说的是,大环境已经这样了,我们已经也无法左右这个市场,根本没有选择的余地,所以,打不过就加入,努力的提升自己能技术能力,直接吊打面试官! 这不,就迎来了大厂级24W字java面试手册!
|
消息中间件 缓存 NoSQL
闭关三月:整理出了这份对标阿里p7的java秋招面试必备指南。
大厂的面试从来不会是固定的,特别是像阿里这种一线互联网公司,想要进这种大厂,每个重点的知识点都是要了解的,给大家带来的春招面试必备指南会从面试官的心理分析,大厂经常问到的问题,以及对面试的问题分析,分享给大家,涉及到的知识点包含了有消息队列,Redis缓存,分库分表,读写分离,分布式系统,高可用架构,spring微服务,等架构专题
|
消息中间件 Dubbo Java
大厂必刷!国内顶级“Java面试总汇2023”跳槽底气 统计通过率95%
前言 今天已经是金九银十的第15天了。不知现在有多少小伙伴找到自己满意的工作了。今年的面试比以往几年的都要多些难度。随着学习it的人越来越多竞争也是越来越多,越来越卷
69 0
|
C语言 C++
开学季||期待和你一同前行
开学季||期待和你一同前行
|
消息中间件 缓存 NoSQL
【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
J3
|
存储 缓存 安全
呕心沥血一周,我交出了这篇 List 面试文章,细不细你们定
呕心沥血一周,我交出了这篇 List 面试文章,细不细你们定
J3
136 0
呕心沥血一周,我交出了这篇 List 面试文章,细不细你们定
|
Web App开发 存储 缓存
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
129 0
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
下一篇
无影云桌面