2026-05-08 11:31:16
字节飞书后端日常实习一面主要涵盖自我介绍、计算机基础知识、Java并发与数据库知识、算法题以及反问环节,整体面试难度较高,对知识掌握的深度和广度都有一定要求,且面试岗位虽为Go但也会考察Java知识。 以下是对面试各环节的详细分析:
自我介绍涉及可靠数据传输(rdt)、流量控制、拥塞控制等方面。可靠数据传输通过序列号、确认应答、超时重传等机制保证数据的准确传输;流量控制使用滑动窗口协议,防止发送方发送数据过快导致接收方缓冲区溢出;拥塞控制则通过慢开始、拥塞避免、快重传、快恢复等算法避免网络拥塞,确保网络的稳定运行。
synchronized:是一种同步锁,用于实现线程间的互斥访问,保证同一时刻只有一个线程可以访问被同步的代码块或方法。
volatile:保证变量的可见性,即当一个线程修改了该变量的值,新值会立即被其他线程看到,但不保证原子性。
管道输入/输出流:是一种特殊的输入输出流,用于在不同线程之间直接传输数据,实现线程间的通信。
ThreadLocal:为每个使用该变量的线程提供一个独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其他线程对应的副本,解决了线程间的数据隔离问题。不过面试者不记得wait()/notify()和join()方法,这两个方法也是线程通信和同步中重要的知识点,wait()/notify()用于线程间的协作,join()用于等待一个线程执行完毕。
乐观锁:认为并发操作不会经常发生冲突,在读取数据时不加锁,只在更新数据时判断是否有其他线程修改了数据,常用的实现方式是CAS(Compare - And - Swap,比较并交换)。
悲观锁:认为并发操作经常会发生冲突,在读取数据时就加锁,保证同一时刻只有一个线程可以访问数据,常见的悲观锁有synchronized和ReentrantLock等。
参数:常见的线程池类型有SingleThreadExecutor(单线程线程池)、FixedThreadPool(固定大小线程池)、ScheduledThreadPool(定时任务线程池)、CachedThreadPool(可缓存线程池)等。线程池的重要参数包括核心线程数、最大线程数、线程空闲存活时间、任务队列等。面试者没有答全参数,以FixedThreadPool为例,当有新任务提交时,如果当前线程数小于核心线程数,会创建新线程执行任务;如果当前线程数等于核心线程数,会将任务放入任务队列;如果任务队列已满且当前线程数小于最大线程数,会创建新线程执行任务;如果当前线程数等于最大线程数且任务队列已满,会触发拒绝策略。
事务具有ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。原子性指事务是一个不可分割的工作单位,事务中的操作要么都做,要么都不做;一致性指事务执行前后,数据库从一个一致状态转变为另一个一致状态;隔离性指多个事务并发执行时,一个事务的执行不能被其他事务干扰;持久性指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。面试者在回答持久性时磕巴,持久性是通过日志实现的,主要是redo log(重做日志)和undo log(回滚日志),redo log记录的是事务对数据库所做的修改,用于在数据库崩溃恢复时保证事务的持久性。
面试者一开始想到的是nlogn复杂度的解法,在面试官引导下尝试实现On复杂度的解法,但存在边界问题。该问题的On复杂度解法通常可以通过找到无序子数组的左右边界来实现,具体思路是分别从左到右和从右到左遍历数组,找到第一个不满足递增和递减顺序的元素位置,从而确定无序子数组的范围。