一面(视频面):
- 自我介绍
- 项目介绍,用到的技术和碰到的难点
- Java的Object类中有哪些方法,各自的作用
- HashMap是线程安全的吗(多线程扩容的链表死环)
- 讲讲HashTable和HashMap的区别
- 为什么HashTable不允许null键值(HashTable起初是为并发环境设计。如果get一个null键返回的结果是null,那么有两种可能: 1.hashtable中存放了一个(null, null)键值对。 2.hashtable中不存在null这个key。 这就要求使用者用containsKey()方法来做进一步确认。但是在这两个操作中间很可能发生并发修改导致结果出错。所以一开始就禁止了null键或null值。相同的理念也可以在其他的并发map中见到。)
- ConcurrentHashMap是怎么确保线程安全的(JDK7的分段加锁,JDK8的行锁)
- 什么时候会出现Fail-Fast机制(遍历并发集合时ModCount发生变化)
- ArrayList是线程安全的吗(对下标的竞争,扩容的竞争)
- 多线程下用什么动态数组(读多写少CopyOnWriteArrayList,Vector)
- 讲讲Synchronized和ReentrantLock的区别(顺便提了对象监视器, JDK5之后引入的偏向锁->轻量级锁->重量级锁以及他们在对象头中的表示,还有CAS和AQS)
- 讲讲对CAS和AQS的理解(AQS基于CAS,基于AQS可以实现用途不同的同步器,基于不同的同步器可以实现用途不同的同步类,如Semaphore, CountdownLatch, ReentrantLock,基于不同的同步类可以实现不同的并发类)
- CAS的ABA问题
- 线程池的各个参数作用
- 线程池的丢弃策略
- LinkedBlockingQueue和ArrayBlockingQueue的区别(前者基于无界链表且take和put分别加锁,后者基于有界数组,take和put用同一个锁)
- 讲讲MySQL数据库引擎
- 讲讲事务的四个隔离级别
- 事务隔离级别是怎么实现的(基于共享锁与排他锁。读取未提交:读不加锁,写加行级排他锁直至事务结束。读取已提交:读加行级共享锁直到读取结束,写加行级排他锁直到事务结束。可重复读:读加行级共享锁直到事务结束,写加行级排他锁直到事务结束。串行化:读加表级共享锁直到事务结束,写加表级排他锁直到事务结束)
(别的问题不记得了)
- 手撕代码:求两个字符串的最长公共子串(动态规划)
- 除了后端方向之外你平时还对什么方向感兴趣(自学过斯坦福机器学习公开课)
- 有什么想问的吗
二面(视频面):
- 自我介绍
- 假设有一个商城应用,如何保证并发的多个相同退款请求只被处理一次(全局唯一请求ID)
- 怎么实现邮件黑名单功能(布隆过滤器 白名单机制)
- 怎么实现单点登录(子服务的登录请求全部路由至主服务,初次登录时在主服务端保存全局会话令牌,后续子服务的局部会话需请求和验证该令牌,退出登录时将该令牌无效化)
手撕代码:
- 用Object类的wait和nofity方法实现一个生产者消费者模型
- 已知平面中两个喷泉的坐标和N个花坛的坐标,求两个喷泉的半径r1和r2,使得喷泉能浇灌到所有花坛,且r1^2加r2^2的值最小。(维护两个大小为N的大根堆A和B,堆A的排序标准为花坛到喷泉1的距离,堆B的排序标准为花坛到喷泉2的距离。先把所有花坛加入堆A,再依次从堆A中将堆顶元素出堆并加入堆B,同时记录下堆A堆顶元素与堆B堆顶元素的平方和S。当堆A为空时,输出整个过程中S取到的最小值,即为答案,时间复杂度O(nlogn),空间复杂度O(n))
总结:面试体验良好,面试官亲切,注重基础和对工业场景的了解。
名企HR一对一咨询
名企HR一对一咨询