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

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

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

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

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







相关文章
|
7月前
|
网络协议 Java 开发工具
七牛云测开一面(60min)面经
作者allin春招的菜鸡芊寻分享的七牛云测开一面面试经历,涉及自我介绍、专业背景、项目经验、技术问题(如缓存问题、Spring Boot自动配置、面向对象特性、String类实现、Maven和Git使用、Linux操作等)、网络协议、数据结构(链表)以及反问环节,作者感觉面试官态度不错,但自己准备的重点问题没有被问到,整体体验良好。
|
10月前
|
算法 Java 程序员
火爆Boss直聘的2023最牛字节Java面试手册!助你狂拿千份offer!
当下程序员现状 根据一些调查报告,可以了解到当下程序员的现状。 首先,从年龄分布来看,年轻的程序员占据了主导地位。 30岁以下的开发者占比最高,为81%,而40岁以上的开发者仅占3%。 这意味着,程序员这个行业在一定程度上是年轻化的,同时也面临着一些中年转行或者技术更新换代的问题。 在性别方面,男性程序员的比例在90%以上,女性程序员的比例较低。 这可能和传统观念中将程序员视为男性职业有关。然而,随着技术的普及和女性对计算机科学的兴趣逐渐提高,女性程序员的比例也在逐渐增加。 从职业发展来看,程序员的职业发展相对较慢。 虽然程序员的薪资普遍较高,但是工作压力也很大,需要不断学习和更
208 0
|
10月前
|
消息中间件 Dubbo Java
24年国内头条最牛的Java面试八股文1000集,不接受反驳!
年后这个时间段, 找工作面试不要停!! 很多朋友据我了解,技术水平和工作经验都很不错,但是面试频频败北。 大家复盘下来发现问题不严重,但是很普遍,10个人里面8个都存在,那就是面试前不做准备。 技巧和避坑先不论,面试题型就不熟悉,没有系统过下大厂真题和必问项目,真正对线上面试官时被打的措手不及。 想要从容应对,就要提前建立把握和自信,这不但来自自身的技术能力水平,更来源于对面试时将要发生的各种情况有预判,做到心中有数。 这里整理了一套跳槽涨薪大厂Java知识点解析及面试题解析,涵盖20个技术栈的大厂面试题及详解文档,各大厂技术重点、面试难点、进阶要点,帮助大家“临阵磨枪”,如有需要的
|
10月前
|
缓存 算法 NoSQL
凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer
近两年是中国互联网企业组织架构升级的大年,阿里、腾讯、小米、快手等知名互联网企业都进行了相应调整。2020年3月12日,字节跳动成立八周年之际,宣布组织全面升级,而这一消息也彻底激起了我对字节跳动的期待。
95后跳槽阿里网晒工资条:多亏面试前补了这个,真香
最近一哥们跟我聊天装X,说他最近从阿里跳槽了,我问他跳出来拿了多少?哥们表示很得意,说跳槽到新公司一个月后发了工资,月入5万多,表示很满足!这样的高薪资着实让人羡慕,我猜这是税后的薪资,税前估计超过6万了。
|
设计模式 算法 中间件
劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷
近几年受疫情影响各行各业的日子都不好过,虽然程序员日子也挺难,但是好在可以线上面试、线上办公,影响还是比较小的,但是去年教育行业的 “双减” 政策,导致又一大批岗位缺失程序员竞争压力突然递升;
|
负载均衡 安全 Java
就这?腾讯云高工熬夜手写'Java微服务学习笔记'也就让我月薪涨3k
本人18年毕业于长沙某大专,实习期间进入一家和学校合作的互联网公司,一直在公司干着千篇一律的CRUD,生活看不到希望,感觉一直在这里CRUD没有希望,所以在春节回来后就离职了,一直在家中学习。和一些大佬在VX群里交流学习的过程中,无意中从一位腾讯云大佬手中拿到了这份由腾讯云大佬亲码的“Java微服务”学习笔记!
|
设计模式 算法 架构师
YYDS!由浅入深学习阿里JDK源码,已在阿里内部疯拿3个金奖
大家好,又是我你们不知道喜不喜爱的架构师之道,今天呢,我想和大家聊一聊JDK源码的问题: * **为什么要看JDK源码** * **JDK源码的阅读顺序** * **JDK源码的最佳学习方法**
161 0
YYDS!由浅入深学习阿里JDK源码,已在阿里内部疯拿3个金奖
|
消息中间件 缓存 NoSQL
【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
|
消息中间件 SpringCloudAlibaba Java
经久不衰!阿里P8私传“金九银十面试”突击手册下载秒破万
程序员的发展,在于横向与纵向的打磨。一个逐渐走向成熟的程序员,是在可以不断精炼自己写CRUD能力的同时,还能主动追求技术拓展。
406 0