转载:
京东
一面:
- java中的锁都有哪些?乐观锁和悲观锁,独占锁和共享锁,重入锁和非可重入锁,公平锁和非公平锁, 轻量级锁和重量级锁。附上自己总结的答案 呵呵:Java并发之Java中的锁
- jvm对锁的优化?锁升级,锁粗话,锁消除的概念。偏向锁->轻量级锁->重量级锁的过程。
- 工作中volatile的使用,volatile的作用是?主要用于DCL单例模式中,volatile的作用是禁止指令重排以及保证线程之间的可见性,底层主要是通过cpu的lock指令,锁住一个对esp寄存器加0的空操作,实现了内存屏障。
- 线程的创建方式?继承Thread,实现Runnable和Callable,或者使用线程池。
- 线程池的核心参数以及工作机制?标准八股文
- 拒绝策略都有哪些?标准八股文
- NIO和BIO的区别?非阻塞IO主要是通过操作系统提供的api,创建socket的时候绑定NON_BLOCK属性,在执行read、accept等操作时,线程不阻塞,一直返回-1。一般可以结合多路复用器select,poll,epoll等使用。
- select,poll,epoll有什么区别吗?select主要将一堆文件描述符传到select的参数中,然后返回有时间就绪的文件描述符的个数,但是还是需要用户线程去主动轮训有哪些文件描述符有事件产生,缺点一是需要将文件描述符从用户态内核态之间拷贝,二是需要用户线程主动轮训文件描述符。epoll是基于事件的回调的,可以通知用户线程那个文件描述符有事件就绪, 用户线程就不需要遍历了。
- 看过操作系统对epoll的实现吗?没看过。
- 讲讲Netty。Netty怎么用的?项目中用到过netty,讲了讲。
- Netty中怎么解决粘包问题的?内置一堆handler,可以换行,可以根据分隔符,也可以根据传输的字节长度,http就是会传输一个content-length。
- Mysql用过吗?项目中没用过mysql,用的是hbase,了解过mysql。
- Mysql的索引是什么数据结构,为什么用这种结构?标准八股文。
- Redis用过吗?常见数据结构,SDS怎么实现的?SDS是一个结构体,里面包含了一个char数组,一个free字段,一个length字段,获取字符串长度是O(1)复杂度,C语言需要从头到尾遍历,复杂度高,另外还有二进制安全,惰性释放,避免缓冲区溢出等有点。
- Redis的部署模式?单机,集群,哨兵等
- Redis主从复制过程?当时不知道。
算法题
链表按k个一组反转。
二面:
由于一面问的基础知识很多,二面主要问问项目。包括项目中的流量走向,微服务拆分,项目qps,考察对项目的了解程度。由于项目因人而异,不用说太多。
另外看我简历上有写大数据相关技术栈,考察了一个HQL的题。具体想不起来了。
算法题:
冒泡排序。由于太长时间没写冒泡排序了,给写成了选择排序。。。
美团
一面:
上来说项目,把项目中的各种问题,各种难点讲了讲。也是比较关注对项目的整体了解,以及对项目中各项指标的了解等。对Java基础方面没怎么问。除了项目方面的问题,主要有以下几个问题:
- Redis主从同步的过程。由于之前在京东就被问过,当时不会回去看书了,这次就回答上了^ - ^。
- 为什么选用Hbase,Hbase和Mysql的区别是什么?怎样做技术选型?
- Hbase调用一次的耗时是多少?
- Hbase索引的原理。
- 介绍一下消息队列。Kafka怎样保证高性能IO的。顺序写磁盘,零拷贝,批量处理减少IO次数等。
算法题:
记不清了,印象中不是很难。
二面:
依旧是说项目,项目对他们来说不是很难。
项目中遇到过什么问题?
项目中用到了Netty,怎么用的,为什么用?
Netty的事件循环是怎么回事?
Netty的线程模型讲一下?Reactor模型。
算法题:
将阿拉伯数字转为大写的汉语数字。注意处理零值,以及三千七百这种。
写算法题的时候看我写的代码还问到了Switch和if的那个性能高一些?Switch有点像数组,if需要不断的从头往后遍历,但是if 有一些优化,如分支预测等。
三面:
前两面都通过了,三面就随便问了一下,基本没问技术的问题,最后出了个算法题。
- 你们做需求怎么做,需求评审怎么做?
- 目前几点上班几点下班?
- 平时团建怎么搞的?多久一次?
- 平时看书吗?最近看了什么书?
算法题:
旋转有序数组中找到某个值?二分查找。
阿里
一面:
- 项目中的容错限流,降级,兜底等怎么做的?
- 如果服务端挂了怎么,怎么降级?多级缓存,客户端内部缓存,CDN缓存。
- 我们项目中是千人一面的兜底,那如何能做到千人千面?
- Mysql异地多活该怎么做?有什么思路?
- 消息队列使用。场景题。
- Netty介绍一下,项目中怎么用的。
- 项目中Rpc用的thrift?thrift用的什么序列化协议?为什么用这个协议?
- redis主从同步?全量同步和增量同步。
- 超大文件排序应该怎么排?
- 数据库异地多活解决方案?附上答案 饿了么异地多活技术实现(一)总体介绍 - 知乎
二面:
全程讲项目,项目中的各种细节,扣的很细,没问任何八股文。
三面:
三面是个p10大佬,也是问了问项目,说我项目比较薄(在大佬眼里当然薄了^_^),然后又问了问我offer的情况和其他家薪资情况,其余的没细问。
头条
一面:
讲项目,除了项目还有下面的问题:
- redis 单机能抗多少qps?
- redis怎么避免热点key的?
- redis中的常见的数据结构?介绍一下SDS?
- 介绍一下跳表数据结构。查询的复杂度?新插入一个节点的流程。
- 为什用Hbase不用Mysql,Hbase的优势在哪?
- HBase的索引以及Mysql的索引有什么区别?
- Java中的HashMap实现原理以及ConcurrentHashMap实现原理?
- CAS概念,有什么缺点怎么解决?
- 项目中有过哪些措施避免Hbase热点Key?
- 解决过什么线上问题?
算法题:
给一个数组和一个数,找出数组中按照该数的全排列。
如数组[1,2,3,4,5],给定的数字是3,输出 [1,2,3],[1,2,4],[1,2,5],[2,3,4],[2,3,5],[3,4,5]
二面:
上来先讲项目,对项目中的问题扩展一下问一问。其余的问题如下:
- 微服务拆分的原则?为啥要拆分微服务?都放在一起有什么弊端?
- 讲讲项目中的流量走向?从DNS->LVS->Nginx->网关服务->聚合服务->基础服务
- 讲讲DNS的流程?DNS和CDN有什么联系?
- Mysql分库分表的场景?什么时候需要分库分表?
- Mysql设计题?项目中很少用到mysql,没回答上。
- Java中的多线程相关的东西。线程池?项目中的线程池用哪个?为什么不用JDK提供的静态方法中的线程池?
- 如果在主线程中创建了三个线程执行任务,想等三个任务都执行完了主线程继续执行,怎么实现?CountDownLatch。
- 手写DCL单例模式,为什么用volatile?
算法题:
数组跳跃到最后需要的最少步。
三面:
讲讲项目,项目没问太细。其余的问题:
- java中的 == 和 equals的异同点,为什么经常需要同时实现equals方法和hashCode方法?
- java中方法调用时传值还是传引用?
- 常见的设计模式?项目中用到过的以及源码中看到过的。
智力题:
四辆小车,每辆小车加满油可以走一公里,小车之间可以将油给其他的车辆,问如何能让其中的一台车走的最远?最远多少?
算法题:
0-1背包问题。
快手
一面:
讲项目,对项目没问太细,只是大概聊了聊。
- 项目中有用到过的应对高并发的措施?消息队列,读写分离,冷热分离,缓存,避免热点key等。
- IO方面?同步阻塞,同步非阻塞,异步非阻塞的概念。
- 有没有异步阻塞IO?
- 讲讲Netty,Netty中怎么解决TCP粘包问题的?
- Redis中的线程模型?为什么说redis是单线程的。
- Redis的特点?怎样保证高可用的?
- Redis的持久化机制?
- Redis的淘汰策略?
- 分布式锁怎么做的?为什么用到分布式锁?
- 消息队列如何保证消息不丢失?
- 消费消息的时候做没做幂等?怎样做的?
算法题:
用数组实现队列。
二面:
先问项目,然后从项目中他比较感兴趣的一个点展开。
- 你们项目中服务注册发现用的什么?用的ZK。
- 为什么用ZK,ZK有什么特性?
- 服务发现的过程?
- Rpc调用的时候路由规则是什么?有权重的随机路由。
- 在服务升级的时候,需要下线掉原来的服务,但是会有时间处于新的服务和旧的服务之间,请求可能会调用到新的代码也可能会调用老的代码,这个你们怎么处理的?
算法题:
实现一个阻塞队列。
由于我看过JDK 中Doug Lea写的源码?所以写的不怎么费劲,下面附上JDK中的给的例子。
注意里面的判断需要用While不能用if,有一个虚假唤醒的机制,用if可能会有错。其实就是因为如果用if的话,if里面的notFull.await()方法会释放掉锁,可能出现其他线程改了这个变量,导致条件不满足了,而用while的话会在继续判断这个条件。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
三面:
三面依旧是上来就讲项目,然后问了问细节。后面主要问了一下下面的问题,从这个问题展开问了很多:
- 线上如果出现耗时长,怎么排查?有可能是什么原因?用Arthas来查,可以定位到具体某个方法调用的耗时。或者查日志,看每个日志的打印出来的时间,在去判断。一般耗时长可能都是有IO操作,可能访问数据库了。
- 怎么避免访问数据库带来的耗时严重呢?加缓存。
- 如果加了缓存还是耗时长可能什么原因呢?可能有缓存穿透的问题。
- 什么是缓存穿透?大量请求查缓存中的数据不存在,流量都直接打到了数据库上。
- 怎样解决缓存透?将请求数据库不存在的值在缓存中存储一个空值,下次请求同一个值的时候就直接访问缓存并且返回了,不会请求到数据库上。
算法题:
对称树的判断。
总结:
总体来说京东给我的面试体验最好,其次是阿里和美团,各个大厂的风格也比较不同,像阿里就完全问项目,几乎不问基础,考察你对项目的了解程度,细节扣的很深,算法也几乎不问,头条就算法题几乎必须做出来,不然基本不会过。