滴滴一面二面三面面经Base杭州
Base杭州 Java开发岗位 上午10:00开始面试,下午1:30左右三面结束
一面 时长42min
自我介绍
本科和硕士学习课程的介绍
谈一下对Java的认识
JVM内存模型
输入网址后的流程介绍
套接字是什么
项目中调用一次查询接口后的流程介绍
controller和service分别负责什么
项目是前后端分离的吗,渲染用的什么技术
数据库连接池介绍及作用
Nginx和CDN介绍
Redis介绍
Redis在具体业务场景下存在的问题和解决的思路
接口幂等性的解释和你实现的方式
通过令牌保证接口幂等性过程的描述,详细问了令牌在业务中生成和删除的时间以及顺序
聊天窗口发了一段文字
MySQL表A,存储引擎InnoDB,字段id,主键id,唯一索引user_id
三个SQL语句
SQL1:select * from A where id =1
SQL2:select * from A where user_id=1
SQL3:select id from A where user_id=1
- SQL1和SQL2性能一样吗
- SQL3需要查询几次
B+树和B树的区别,优劣
单例的优点和缺点
分析单例在并发读和并发写下的安全性问题
手写个DLC单例
缺少第一个if语句会有什么问题
反问环节
二面 时长55min
自我介绍
实习项目业务介绍
实习过程中做的工作,中间会提出问题
描述下实习期间耗费最多精力完成的功能
本科和硕士学习过的课程(非科班的几乎都会问这个)
进程的状态
进程间通信的目的、方式
(这里说了一大堆,就是按照方式——旧方式的问题——新方式——新方式引入的问题的思路总结的)
进程间通信目的:保证先后顺序、依赖关系、消息传递
忙等互斥:
- 屏蔽中断:最简单,但可能导致系统终止
- 锁变量:0和1分别表示有无锁的状态,但是加锁引入原子性问题
- 严格轮训:自旋锁思想,但是过度自旋可能造成资源浪费
- Peterson方法
- TSL指令 Test and Set Lock
睡眠与唤醒: 忙等互斥没有优先级的概念,是公平的,会造成CPU的浪费
- sleep和wake up系统调用 唤醒未睡眠的进程导致唤醒丢失
- 引入唤醒等待位 但是针对多线程需要设置多个等待位
信号量:
利用大于0的整形变量和down、up 的操作,通过检查信号量、更新、必要时使进程睡眠三步期间屏蔽全部中断保证原子性
互斥量:
信号量的加单版本,没有计数能力,更简单有效
管程:
编程语言具有的特性,不同的实现方式,感兴趣的可以另行了解
消息传递:
信号量、互斥量、管程适用于单机环境,不使用与分布式环境,消息传递适用于分布式环境
屏障:
针对大量进程,可以进行对进程分组,创建进程组,屏障针对进程组进行操作
面试官一直在耐心听,没有打断,很nice
虚拟内存实现原理和作用
虚拟内存实现的集中方式,分段分页和段页式
TCP中time-wait的作用
TCP为什么是可靠的连接
锁优化的过程
synchronized和reentrantlock的区别
手写一个DLC单例(没错,又写了一遍)
手写多线程:在主线程中新建一个子线程,子线程输出hello,主线程输出world,要求有先后顺序
手撕:给定一个字符串,找到这个字符串中最大的字母,在该字母后添加“(hello)”,如果有多个最大字母,就添加多次
三面 时长40min
自我介绍
实习时长为什么只有一个半月
实习项目业务介绍
难点是什么(说完了面试官古井无波的神情仿佛在对我说,就这?)
个人项目的介绍,压测时并发有多少
让你设计tomcat容器的线程数,你会考虑从什么角度去设计
(说完了面试官问还有吗,仿佛在对我说,就这?)
一系列的场景题,部分题目会在你回答完之后继续问,比如消息队列可以解决这个问题,那我现在不使用消息队列,单从数据库角度去设计,如何解决这个问题
手撕代码题
给一个十进制数,返回其转成二进制后有多少个1
写了个与操作位运算的思路,面试官问还有更好的方案吗(仿佛在对我说,就这?)
然后聊天窗口发了一段内容如下
public class P1 { private long b = 0; public void set1() { b = 0; } public void set2() { b = -1; } public void check() { System.out.println(b); if (0 != b && -1 != b) { System.err.println("Error"); } } }
问三个线程死循环分别执行set1、set2和check方法,控制台打印的数据会有哪些
直觉让我说了0,-1,Error都会打印,面试官问为什么,我真不知道,然后面试官还是追问要我解释,说我可以写三个死循环的子线程运行一下看看结果,说不定就知道为什么了
我从原子性和指令重排序的角度去分析,因为面试官先问了下是否了解JVM,然后才出的这道题,中间我和面试官询问是否是因为某某原因导致的问题,面试官古井无波地说你给出解释就可以。我这道题回答得一点也不好,后面就是反问环节,我直接问面试官这是JVM哪一块的知识,我回去巩固一下,面试官说就JVM前几章有提到的内容,涉及到long类型数据分两次读,赋值、判断语句中间不能保证原子性,会输出0,-1,Error和-4294967296、4294967296
分析可见http://www.voidcn.com/article/p-suizafkg-brr.html
但是复盘的时候我本地跑了一遍,输出只有0和-1,难不成是因为我的JDK版本比较新,后续修复了这个问题?这里有知道的大佬可以评论区指导一下。
class Demo { public static void main(final String[] args) { final P1 v = new P1(); final Thread t1 = new Thread() { public void run() { while (true) { v.set1(); } } }; t1.start(); final Thread t2 = new Thread() { public void run() { while (true) { v.set2(); } } }; t2.start(); final Thread t3 = new Thread() { public void run() { while (true) { v.check(); } } }; t3.start(); } }
最后另一个帖子里分享了字节杭州游戏业务部门、美团北京部门、有赞杭州部门的面经,需要的可以移步https://www.nowcoder.com/discuss/520062?toCommentId=7524630
#面经##滴滴##校招##Java工程师#