字节提前批飞书Java三+四面面经(已意向)
三面(8.7 1h):面试官全程乐呵呵的,看起来就是大佬风范,呜呜呜...
- 简单自我介绍一下
- 讲讲你的项目(让我讲了15min....)
- 死锁的条件(互斥,占有和等待,不可抢占,环路等待,并讲了如何预防)
- 说的特别好,哲学家进餐问题了解吗?(n个哲学家,n只筷子 ...)
- 哲学家进餐问题,怎么破坏死锁?选择哪个条件破坏?(如果是占有和等待,就让哲学家一次性拿两个筷子,封装成原子性操作,否则就不拿。如果是不可抢占,就让哲学家持有筷子时设置一个过期时间,拿不到就释放。如果是环路等待,就给筷子编号)
- 破坏环路等待这个条件会有什么问题?(一时间没反应过来,支支吾吾)我建议你写一下(我都不知道写啥,随便划了几笔,然后说没get到意思),就是比如说哲学家1拿[1,2],哲学家2拿[2,3],会有什么问题?(噢,原来是这个意思,最后在纸上划了下说哲学家5会拿[5,1],即使给筷子编号后还是循环了)这个问题怎么解决?(颠倒其中一个哲学家的顺序,不过我还没验证这个正确性)是的,就是这个。
- 做道题放松一下: 有一个Data 类,里面实现了lock方法,提供了lock()和unlock(),现在有一个线程不安全的方法:swap(Data D1, Data D2),请你实现一个线程安全的方法:swap_threadsafe(Data D1, Data D2)
- 最后这道题绕了很久,一直get不到面试官的意思。最后面试官说我直接告诉你吧,用两个对象的object_id处理。
- 我这是压力面,不知道你有没有感觉(噢,我好像没什么感觉,主要是你一直乐呵呵的,我就比较放松...)
- 反问:忘记准备反问问题了,随便问了个进去写go写哪些方面,面试官回答的我也忘了...
然后面试结束了。只留下凌乱的我。
过了两个小时,HR打电话告诉我说前两面面评不错,第三面有点问题,联系我8.11四面。
于是,这几天我疯狂看牛客字节的面经,操作系统和计网各种边边角角补了一堆,各种花里胡哨的链表也写了一堆。
结果四面问我的全是比较常规的问题,这几天的努力一点也没发挥出效果,反倒之前的八股和项目忘了很多,导致回答起来不是很流畅,口误也比较多。
四面(8.11 1h):面试官看起来30有余。开头自我介绍因为网络原因面试官说一直听不清楚。我说我开热点吧,然后找了3min手机... 找的我心态都崩了。
- 简单自我介绍一下
- RabbitMQ延迟队列怎么实现?(答的有点磕磕盼盼,不过意思还是说清楚了。建一个无消费者的队列,给队列设置消息的TTL,消息过期后的route-key以及消息过期后前往的交换机。当该队列里消息经过TTL过期后根据交换机和route-key路由到另一个队列,由监听这个队列的消费者消费)
- 对分布式事务的理解(也有点磕磕盼盼。两条不同连接里要保证逻辑上的事务一致性就是分布式事务。分布式事务实现有两种,一种是基于XA保证强一致性的Seata,另一种是基于最终一致性在业务逻辑层通过消息补偿实现,之后举了下单和锁库存之间保证事务的例子)
- Seata通过XA实现分布式事务的流程(有三个角色:事务协调器,大事务,小事务... balabala流程说了一半发现自己不记得了,于是直接和面试官说具体细节我忘记了...)
- TCC了解吗?(相当于2PC手动版,我们要自己实现三个方法,具体不记得了,因为没用过)
- volatile特性(保证线程之间的可见性,防止指令重排。然后讲了CPU缓存一致性,总线嗅探,JVM加内存屏障指令等等)
- CAS原理讲一下(4个参数,1是指向对象的地址,2是偏移量,3是旧值A,4是新值B。首先根据1和2从内存地址取值存到A里,然后对该值修改得到新值存到B里,在写回内存前从内存地址里取最新的值和A进行比较,如果一致就写入,否则返回false)
- G1如何处理大对象的(这里答的不太好,有点乱,感觉有点跑题。G1垃圾清理是软实时的,用户可以设置G1垃圾清理的时间。G1并不是一直会清理老年代,而是堆内存到45%开始清理。G1里有一个个region,清理时会对region进行价值评估,然后结合用户设置的清理时间选择对内存性价比最高的region清理)
- TCP三次握手,四次挥手讲一下(balabala)
- TCP拥塞控制讲讲(讲了网络拥塞是啥,处理拥塞控制的流程)
- 设计模式里观察者模式(有Subject和Observer,Subject里维护一个List<Observer>,当Subject里的数据源发生变化时,遍历这个数组,调用Observer里的方法,这样Observer就可以感知到Subject里的数据变化,并且执行相应的操作)
- 设计模式6大原则(这里答的是真的乱,6大原则名字我都忘了,磕磕盼盼的把6大原则是啥大概说了下。如果是以前我可以把这6大原则设计的原因和好处都解释一遍的)
- linux查看客户端网络连接状态的指令(不会,linux指令平时一般用于grep日志和进行一些部署操作。后来百度了下是netstat指令)
- 手写观察者(5min)
- LC322 零钱兑换(7min写完,运行时遇到一个输入输出的奇怪的bug导致结果不对,捣鼓了10min. 当时紧张死了,以为自己做错了。还好最后解决了)
- 说一下你debug的过程。(我的逻辑是对的,只是处理输入输出这里有点问题,然后把问题复现了,并讲了思路)
- 反问:进去之后转go的话在学习知识上需要偏向于哪些方面,比如是偏向于操作系统这种底层还是RabbitMQ这些中间件的应用级别(面试官说了一大堆,起码说了5分多钟... 最后给的建议是在学校期间多了解了解一些技术,然后专精一个方向,比如专精redis,这样之后遇到redis的问题你就可以处理了)
总体而言面字节面的我心累。
许愿HR面吧...
——8.20更新——
已收到意向,无HR面。祝各位小伙伴早日收割满意的offer~
——9.06更新——