作者:小傅哥
博客:https://bugstack.cn
积淀、分享、成长,让本人和别人都能有所播种!????
一、前言
最近给大家整顿一些面试现场,实在的面试题和答案以及总结
尽管技术的知识点是固定的,但不同大厂不同面试官的发问形式却不一样。一方面是你的简历的内容影响,另外一方面是受面试官的个人经历导致。最终就看你们是否对脾气了,如果不对换个部门从新投
但如果你能把一个知识点真的搞懂,是真的懂。那么,无论面试官怎么问,其实都能答复的很精彩,精彩决定了你的职位和薪资。
为了让大家在当前的面试中都能精彩,像秀一样,特此筹备整顿一些实在的面试现场分享给大家,心愿对每一个求职时都有帮忙。不过这些都是底层技术的学习帮忙,如果你心愿本人更牛,那么要多学习、多积攒!
如果本文波及的 Java 核心内容不能很好的了解,能够浏览小傅哥的《Java 面经手册》,全书共 5 章 29 节,417 页 11.5 万字,耗时 4 个月实现。涵盖数据结构、算法逻辑、并发编程、JVM 以及简历和互联网大厂面试等内容。同时此书并不是单纯的面试题,也不是内卷八股文。而是从一个单纯的和程序员无关的数学知识点开始,深刻解说 Java 的核心技术。
二、面试现场
背景
小伙伴面的是美团,求职方向是团队技术负责人。此次面试以连环诘问的形式为主,喜爱刨根问底,十分考研面试者的技术功底。以下是整顿出的 局部面试题
,咱们看看这些题该如何答复。
先让写个线程平安的单例模式
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 唬住喽
可见性和指令重排是怎么回事?
- 可见性,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 呢?
个性 | Kafka | RocketMQ | ActiveMQ | RabbitMQ |
---|---|---|---|---|
吞吐量 | 高吞吐量,可达 10w 级别 | 高吞吐量,可达 10w 级别 | 1w 级别,吞吐量相交比拟低 | 1w 级别,吞吐量相交比拟低 |
时效性 | 提早在 ms 级 | 提早在 ms 级 | 提早在 ms 级 | 提早在奥妙级,提早最低 |
可用性 | 人造的分布式系统,数据有正本机制,可用性十分高 | 分布式架构,可用性十分高 | 主从架构,可用性较高 | 同 ActiveMQ |
维护性 | 基于 Java 和 Scala 语言 实现,社区活跃度高,保护老本较低 | 基于 Java 语言实现,社区活跃度高,保护老本较低 | 基于 Java 语言实现,音讯队列场景性能很齐备,但社区活跃度较低,保护老本较高 | 基于 erlang 语言开发,社区活跃度个别,小团队保护老本较高 |
- 首先要晓得,开源社区有很多优良的队列中间件,比方 RabbitMQ、ActiveMQ、RocketMQ、Kafka,有些大厂还有自研的 MQ 队列中间件。
- 解耦、消峰、驱动等场景下的业务时以及日志采集零碎、监控零碎、流式解决等各类场景中都离不开 MQ 队列。
你感觉对于一个消息中间件来说,须要达到哪些要求?
- 高吞吐、低延时、可用性和可维护性,是音讯队列中间件的外围要求。
- 同时你能够说出,中间件的作用是解决共性凝练和复用,从实质上晋升代码的复用性、松耦合和互操作的规范机制,从而晋升研发整体交付效率。
Kafka 是如何做到高吞吐量的?
- Kafka 是分布式音讯零碎,须要解决海量的音讯,Kafka 的设计是把所有的音讯都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,应用硬盘并没有带来过多的性能损失。次要围绕程序读写、零拷贝、文件分段、批量发送和数据压缩几个方面进步吞吐率。
接下来是对于一些我的项目的问题
- 在公司做过哪些项目,次要是哪方面?根底中间件还是业务我的项目?这个我的项目的次要难点在哪里?怎么解决的?
- 我的项目做到当初,有没有一些数据上的评估指标,示意这个我的项目做得不错?如果没有,那么当初让你本人评估一下,你感觉应该从哪些方面做考量?
- 对于一个零碎来说,如何确保它的稳定性?(线程池用的哪种?为什么要用这几种?怎么用的?)
- 你在我的项目当中表演什么样的角色?零碎 Owner 还是开发?
- 你们团队的人员散布是怎么样的?内编几个,外包几个?如果带外包的话,如何治理外包?
面试复盘
- 基础知识要牢固,JVM 内存散布,多线程,根本是面试必问的。其中多线程并发的源头:可见性,有序性,原子性相干的知识点肯定要深刻了解,能讲多分明就讲多分明,因为这些波及到 CPU,内存,指令集等底层常识,是多线程实践的源头。这方面的货色,如果面试官自身具备肯定实力的话,是很容易深究上来的,如果只是浅尝辄止,只知其一; 不知其二,很容易裸露本人底层常识的不牢。逼格就会升高一个大的品位。
- 要有肯定入手能力,一些常见的设计模式要随时随地能够写进去,如果有多种计划实现的话,须要都讲进去,并指出其中的优缺点。
- 分布式实践要扎实,要深刻了解常见 RPC 框架(如 dubbo)和音讯队列的设计和实现原理。一个框架的呈现,以及平时业务开发所遇不到的各种高阶知识点(比方 dubbo 的重试机制,熔断,降级服务等,kafka 相比 ActiveMQ 等其它音讯队列,劣势在哪里,为什么它能够撑持那么高的吞吐量等等),肯定是为了解决某些特定问题才会呈现的,理解了问题源头,能力更好了解框架的全局设计思维,而后能力更好地排汇框架外面的各种解决方案以及背地体现进去的思维。
- 网络根底要夯实,http,https,TCP/IP 协定以及网络通信的基础知识还是要晓得的。
- 理论我的项目肯定要学会总结,让人看到你做我的项目的亮点(代码标准,可维护性,可扩展性,稳定性,性能优化,访问量,以及一些其它的数据指标)。如果没有,肯定要想方法本人退出一些可信的货色进去。毕竟面试官无奈验证你说的是真是假,如果说得很像那么回事,面试官应该还是会认可的。
三、总结
- 如果你不心愿面试时本人的薪资、待遇、职位,被他人安顿来摆弄去,就要一直的在开发过程中提炼、总结、演绎本人的常识项,找到集体的价值力量,一直的去扩宽和加深。
- 我特地批准本文我的小伙伴
豆豆
的总结,也是此次求职者的分享;“程序员不是一个木偶人,不只是被动的接需要或者工作,也不能只是埋头苦干”。公司是没有永远稳固的,互联网的变动也更多,只有本人领有了留下的本事和走进来的能力,才是集体的最平安区域。 - 最初心愿每一个研发小伙伴都能有所积攒和积淀,把那些视频当电影、看文章当小说的故障改改,要学会动起来,验证起来,实际能力让一个常识更能落到本人的脑子里。
四、系列举荐
- 不会写简历看这个:《半年招聘筛选了 400+ 份简历,通知你怎么写容易被撩!》
- 问的答不上看这个:《Java 面经手册》PDF,全书 417 页 11.5 万字
- 想刺激本人看这个:《数学,离一个程序员有多近?》
- 能够入职了看这个:《一次代码评审,差点过不了试用期!》