20220331 | 美团 | 后端研发
面试官很有礼貌,面试体验极佳,上来先做了自我介绍,美团优选上海部门,主要做的是营销活动、小游戏的开发
自我介绍
Java
-
ArrayList和LinkedList区别?
-
实现 subList(startIdx, endIdx) 的思路?
- arrayCopy将原数组复制到新的数组中
- 面试结束后反馈:应该用offset
- concurrentHashMap中put具体流程?
分段锁
-
红黑树的优势?
-
concurrentHashMap扩容流程?
-
AtomInteger如何实现线程安全?
CAS + 版本号
- CAS在OS层的实现?
CPU中的一条原子指令:X86下对应的是CMPXCHG汇编指令
- synchronized如何在OS层实现?锁优化过程?如何实现可重入?标记重入次数的信息保存位置?
javac在编译成字节码时,会生成对应的monitorenter和monitorexit指令分别对应synchronized同步块的进入和退出 每次进入都需要将计数器+1,退出-1,直到计数器归零表明释放锁 https://blog.csdn.net/javazejian/article/details/72828483
- volatile功能?如何实现可见性?
可见性+有序性 可见性:修改后写回主内存,在汇编层面加Lock,使用缓存一致性协议(MESI)解决并发可见性 有序性:内存屏障,在指令间插入一条内存屏障并禁止cpu对Volatile修饰的变量进行重排序 不能保证原子性!
- Java线程有哪些状态?
- 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
- 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
- 阻塞(BLOCKED):表示线程阻塞于锁。
- 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
- 终止(TERMINATED):表示该线程已经执行完毕。
-
线程池参数?
-
工作队列类型?
线程安全
- 🚀 Java线程种类?启动后是否可以改成守护线程?
用户线程: 守护线程:
数据库
-
B+树
-
更新时一致性
-
缓存雪崩
网络
-
TCP链接可靠性
-
OSI七层模型
-
网络层 传输层?
-
HTTP1.0 1.1 2.0 之间的区别?
算法题
- 快排找到最大的第K个数
反问
代码有bug,这么简单的题debug半小时都没过,应该是挂了😅
面试结束后看了眼代码,循环里面有个大于号写反了,无语,与美团无缘了,有时候人生就是这么奇妙