面试现场:小伙伴美团一面的分享和分析「含解答」

简介: 最近给大家整理一些面试现场,真实的面试题和答案以及总结虽然技术的知识点是固定的,但不同大厂不同面试官的提问方式却不一样。一方面是你的简历的内容影响,另外一方面是受面试官的个人经历导致。最终就看你们是否对脾气了,如果不对换个部门重新投但如果你能把一个知识点真的搞懂,是真的懂。那么,无论面试官怎么问,其实都能回答得很精彩,精彩决定了你的职位和薪资。

目录

  • 一、前言
  • 二、面试现场
  • 三、总结
  • 四、系列推荐

一、前言

最近给大家整理一些面试现场,真实的面试题和答案以及总结

虽然技术的知识点是固定的,但不同大厂不同面试官的提问方式却不一样。一方面是你的简历的内容影响,另外一方面是受面试官的个人经历导致。最终就看你们是否对脾气了,如果不对换个部门重新投

但如果你能把一个知识点真的搞懂,是真的懂。那么,无论面试官怎么问,其实都能回答得很精彩,精彩决定了你的职位和薪资。

为了让大家在以后的面试中都能精彩,像秀一样,特此准备整理一些真实的面试现场分享给大家,希望对每一个求职时都有帮助。不过这些都是底层技术的学习帮助,如果你希望自己更牛,那么要多学习、多积累!

二、面试现场

背景

小伙伴面的是美团,求职方向是团队技术负责人。此次面试以连环追问的方式为主,喜欢刨根问底,非常考验面试者的技术功底。以下是整理出的部分面试题,我们看看这些题该如何回答。

先让写个线程安全的单例模式

public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {
    }
    public static Singleton getInstance(){
       if(null != instance) return instance;
       synchronized (Singleton.class){
           if (null == instance){
               instance = new Singleton();
           }
       }
       return instance;
    }
}
  • 考察线程安全的单例模式,一方面是对基础的了解,另一方面以单例模式作为入口考察并发编程的知识点。
  • 在这里你要知道,并发编程的三要素包括:原子性、可见性、有序性。
  • 那具备三要素知识点的单例模式,主要是如上案例中的双重检查锁和CAS锁等策略。而双重检查锁的单例方式,对于面试官和求职者来说,可以往下继续聊的点就有了。
  • 当然,如果你没有写出这样一种单例模式,大概率会被面试官引导过来。在面试的过程中最好的方式是主动和引导面试官走,也称对脾气,也就是技术臭味相投的感觉。

高并发下,单例模式会存在哪些问题?

  • 单例模式就是以防止线程不安全和提高代码执行效率而设计的。
  • 双重锁定检查(DCL,Double Check Lock),也就是为此设计的。别被 DCL 唬住喽
  1. 可见性和指令重排是怎么回事?
  • 可见性,Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排它锁单独获得这个变量。
  • 指令重排,在程序执行过程中为了性能考虑,,编译器和 CPU 可能会对指令重新排序。对于并发多线程场景下,指令重排会产生不确定的执行效果。

voliate 关键字为什么可以解决可见性和指令重排?

可见性

  • 首选,volatile 关键字修饰的共享变量可以提供这种可见性规范,也叫做读写可见。
  • 被 volatile 关键字修饰的共享变量在转换成汇编语言时,会加上一个以 lock 为前缀的指令,当CPU发现这个指令时,立即将当前内核高速缓存行的数据回写到内存,同时使在其他内核里缓存了该内存地址的数据无效。
  • 另外,在早期的 CPU 中,是通过在总线加 LOCK# 锁的方式实现的,但这种方式开销较大。所以Intel开发了缓存一致性协议,也就是 MESI 协议,该解决缓存一致性。
  • volatile 的好处,volatile 是一种非锁机制,这种机制可以避免锁机制引起的线程上下文切换和调度问题。所以,volatile 的执行成本比 synchronized 更低。
  • volatile 的不足,volatile 关键字只能保证可见性,不能保证原子性操作。
  • 此外如果你还能回答出,Unsafe.loadFence(); 保证在这个屏障之前的所有读操作都已经完成。的一些使用,那么面试绝对可以加分。

指令重排

public volatile boolean sign;
    descriptor: Z
    flags: ACC_PUBLIC, ACC_VOLATILE
  • 从字节码层面,添加 ACC_VOLATILE,在汇编指令的打印会有 lock addl $0x0,(%rsp)s
  • 从 JVM 层面,JMM 提供了8个 Happen-Before 规则来约束数据之间竞争、4个内存屏障 (LL LS SL SS)和As-if-serial
  • 从硬件层面,sfence、lfence、mfence

除了双重检查锁之外,还有什么别的办法实现线程安全的单例模式。

public enum Singleton {
    INSTANCE;
    public void test(){
        System.out.println("hi~");
    }
}
@Test
public void test() {
    Singleton_07.INSTANCE.test();
}
  • 如果再让写一种差异比较大,方式不太一样的单例模式,那么 Effective Java 作者推荐使用枚举的方式这个时候可以甩出来秀一波了。
  • 这种方式解决了最主要的;线程安全、自由串行化、单一实例。

你看过什么源码吗?JVM 的源码是否看过?

  • 看过Dubbo、Spring、Mybatis等框架和一些中间件的源码,关于 JVM 多线程、并发、锁等核心内容的源码有所了解。
  • 其实这块问你的内容,主要考察你对技术的学习是否有核心深度。如果你能对此有所回答,那么会得到面试官的一定认可。

Dubbo是怎么工作的?

  • 简单来说,引入 Dubbo 服务的接口提供方与接口消费方,通过注册与拉取接口信息,把服务双方通过 Socket 进行连接。之后接口通信的时候通过代理类传输 Socket 请求,再由接口提供方通过反射调用真实服务,最终把接口执行信息返回给调用端。
  • 在整个的回答过程中,可能会聊到注册中心、代理、反射、通信模型以及 Netty 的相关知识,这主要包括了通信协议的定义、半包粘包以及流量整形和各类知识。

Dubbo通信是用的什么协议?

  • Dubbo 主要支持这些协议:dubbo://、rmi://、hessian://、http://、webservice://、thrift://
  • rmi 协议:走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用
  • dubbo协议:默认就是走此协议,单一长连接,NIO 异步通信,基于 hessian 作为序列化协议
  • hessian协议:走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用于文件的传输,一般较少用
  • http协议:走json序列化
  • 此外序列化的方式还有protobuf,protobuf 全称 Google Protocol Buffers,是 google 开发的一套用于数据存储,网络通信时用于协议编解码的工具库。

9 .属于网络传输中的哪一层?

  • TCP/IP 四层模型,是 OSI 七层模型的简化,泛指众多(TCP,UDP,IP等)协议。
  • Dubbo 协议是 TCP 协议之上的协议,采用单一长连接和 NIO 异步通讯。

TCP/IP协议来说建立连接的时候,为什么需要三次握手?

  • 三次握手是在安全可靠的基础上最少握手次数的方案,而两次握手并不能保证可靠性,四次握手又浪费了传输效率。
  • TCP 传输控制协议,是一个面向连接的协议。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。对于这部分知识可以深入了解下,资料也很丰富。

你刚才说你们公司用的是Kafka,那么你觉得什么场景下要用到Kafka呢?

  • 首先要知道,开源社区有很多优秀的队列中间件,比如 RabbitMQ、ActiveMQ、RocketMQ、Kafka,有些大厂还有自研的 MQ 队列中间件。
  • 解耦、消峰、驱动等场景下的业务时以及日志采集系统、监控系统、流式处理等各类场景中都离不开MQ队列。

你觉得对于一个消息中间件来说,需要达到哪些要求?

  • 高吞吐、低延时、可用性和可维护性,是消息队列中间件的核心要求。
  • 同时你可以说出,中间件的作用是解决共性凝练和复用,从本质上提升代码的复用性、松耦合和互操作的标准机制,从而提升研发整体交付效率。
  1. Kafka是如何做到高吞吐量的?
  • Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失。主要围绕顺序读写、零拷贝、文件分段、批量发送和数据压缩几个方面提高吞吐率。

接下来是关于一些项目的问题

  • 在公司做过哪些项目,主要是哪方面?基础中间件还是业务项目?这个项目的主要难点在哪里?怎么解决的?
  • 项目做到现在,有没有一些数据上的评价指标,表示这个项目做得不错?如果没有,那么现在让你自己评价一下,你觉得应该从哪些方面做考量?
  • 对于一个系统来说,如何确保它的稳定性?(线程池用的哪种?为什么要用这几种?怎么用的?)
  • 你在项目当中扮演什么样的角色?系统Owner还是开发?
  • 你们团队的人员分布是怎么样的?内编几个,外包几个?如果带外包的话,如何管理外包?

面试复盘

  • 基础知识要牢固,JVM内存分布,多线程,基本是面试必问的。其中多线程并发的源头:可见性,有序性,原子性相关的知识点一定要深入理解,能讲多清楚就讲多清楚,因为这些涉及到CPU,内存,指令集等底层知识,是多线程理论的源头。这方面的东西,如果面试官本身具备一定实力的话,是很容易深究下去的,如果只是浅尝辄止,一知半解,很容易暴露自己底层知识的不牢。逼格就会降低一个大的档次。
  • 要有一定动手能力,一些常见的设计模式要随时随地可以写出来,如果有多种方案实现的话,需要都讲出来,并指出其中的优缺点。
  • 分布式理论要扎实,要深入理解常见RPC框架(如dubbo)和消息队列的设计和实现原理。一个框架的出现,以及平时业务开发所遇不到的各种高阶知识点(比如dubbo的重试机制,熔断,降级服务等,kafka相比ActiveMQ等其它消息队列,优势在哪里,为什么它可以支撑那么高的吞吐量等等),一定是为了解决某些特定问题才会出现的,了解了问题源头,才能更好理解框架的全局设计思想,然后才能更好地吸收框架里面的各种解决方案以及背后体现出来的思想。
  • 网络基础要夯实,http,https,TCP/IP协议以及网络通信的基础知识还是要知道的。
  • 实际项目一定要学会总结,让人看到你做项目的亮点(代码规范,可维护性,可扩展性,稳定性,性能优化,访问量,以及一些其它的数据指标)。如果没有,一定要想办法自己加入一些可信的东西出来。毕竟面试官无法验证你说的是真是假,如果说得很像那么回事,面试官应该还是会认可的。

三、总结

  • 如果你不希望面试时自己的薪资、待遇、职位,被别人安排来摆弄去,就要不断的在开发过程中提炼、总结、归纳自己的知识项,找到个人的价值力量,不断的去扩宽和加深。
  • 我特别同意本文我的小伙伴豆豆的总结,也是此次求职者的分享;“程序员不是一个木偶人,不只是被动的接需求或者任务,也不能知识埋头苦干”。公司是没有永远稳定的,互联网的变化也更多,只有自己拥有了留下的本事和走出去的能力,才是个人的最安全区域。
  • 最后希望每一个研发小伙伴都能有所积累和沉淀,把那些视频当电影、看文章当小说的毛病改改,要学会动起来,验证起来,实践才能让一个知识更能落到自己的脑子里。

作者|bugstack虫洞栈|公众号

相关文章
|
1月前
|
存储 安全 Java
每日大厂面试题大汇总 —— 今日的是“美团-后端开发-一面”
文章汇总了美团后端开发一面的面试题目,内容涉及哈希表、HashMap、二叉树遍历、数据库索引、死锁、事务隔离级别、Java对象相等性、多态、线程池拒绝策略、CAS、设计模式、Spring事务传播机制及RPC序列化工具等。
45 0
|
21天前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
1月前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
23天前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
消息中间件 存储 缓存
美团面试: Kafka为啥能实现 10Wtps 到100Wtps ?kafka 如何实现零复制 Zero-copy?
40岁老架构师尼恩分享了Kafka如何实现高性能的秘诀,包括零拷贝技术和顺序写。Kafka采用mmap和sendfile两种零拷贝技术,前者用于读写索引文件,后者用于向消费者发送消息,减少数据在用户空间和内核空间间的拷贝次数,提高数据传输效率。此外,Kafka通过顺序写日志文件,避免了磁盘寻道和旋转延迟,进一步提升了写入性能。尼恩还提供了系列技术文章和PDF资料,帮助读者深入理解这些技术,提升面试竞争力。
美团面试: Kafka为啥能实现 10Wtps 到100Wtps ?kafka 如何实现零复制 Zero-copy?
|
1月前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。