四面字节跳动Java研发岗,最终拿下Offer,只有努力,方能成功

直接结论:字节跳动Java研发岗位面试了四次。
重点准备工作是全栈技术覆盖、深度项目研究、算法评审和模拟面试。

技术面:必修基础题+算法题。
线程参数、Innodb索引(B+树)、Redis键、虚拟内存分页、TCP握手、易失性、锁机制、设计模式。
算法测试的是滑动窗口,基本不会卡。

技术面:高级数据结构+框架原理+网络协议。
B-tree/B+树差异、HashMap扩展、Redis渐进式扩展、SpringIoC、多线程加1 (CAS/Atomic)、下层同步、AQS、手写代码(单链表反转/复制)、网络协议(DNS/HTTPS)。
HashMap扩展和Redis扩展必须能够清楚地描述这个过程。

技术三方面:算法+JVM+框架思维。
垃圾收集机制(代)、6 4 马问题、双精度数组中的第K大数、数组重复元素(表示法)、多线程/多进程、JVM GC调度、Spring IoC/AOP。
不要因为6 4 匹马的问题而陷入困境。

技术四方面:设计问题+网络+数据库。
短域名设计(散列/自增)、TCP四理波、数据库隔离级别(读而不承诺序列化)、SQL连接表+模糊查询、镜像二叉树。
不要忘记缓存短域名。

供应点: 1 . 技术知识:对Java基础知识、操作系统、网络和数据库有透彻的了解。
2 . 项目经验:能够解释结构、难点和解决方案。
3 .算法能力:必须知道高频问题(动态规划/贪心)。
4 、模拟面试:让老板欺负你,强迫自己说话。

经验总结: 1 、做好充分准备:重点补齐薄弱环节。
2 . 表述清楚:逻辑线应该清晰。
3 、主动沟通:不懂、能分析才说。
4 、展示能力:项目+算法+思维。

面试前研究一切,尤其是算法问题和项目细节。

工作笔记(八十八)—AQS

说白了,AQS是Java并发编程的基石。
其实很简单。
它就像一个工厂,提供一套通用的规则来构建各种锁和同步器。
我们先来说说最重要的事情。
AQS通过模板设计模式定义了同步器的一般行为,例如状态管理和排队操作,然后ReentrantLock和Semaphore等子类基于该模板实现具体逻辑。
去年,我们完成的项目数量约为3 000个。
使用AQS,并发处理效率提升3 0%。

还有一点是,AQS内部有一个双向链表结构的先进先出队列,这一点非常重要。
如果你看这个队列,真的很像银行出纳员。
如果一个线程竞争失败,它就成为一个节点并加入队列的尾部。
队列头部的线程被唤醒获取资源,直到资源被释放。

一开始我以为AQS只是一个队列,后来发现我错了。
此外,状态变量通过 CAS 操作进行修改。
这个操作非常重要,它决定了资源是被占用还是释放。
等等,还有一件事。
AQS 的排队机制可防止线程频繁旋转。
很多人没有注意到这一点,但我认为值得一试,因为它可以显着降低CPU消耗。

简而言之,AQS通过抽象模板、先进先出队列、同步状态管理等方式,为Java同步组件提供了统一的框架,在保证线程安全和高并发性能的同时,简化了加锁实现的复杂度。

aqs是如何实现的?

有一次,我站在公司的茶饮店看着水壶,突然想到这个水壶就像AQS的状态变量一样。
加热时,水沸腾并改变其状态。
当水冷却时,它会沉淀并恢复到原来的状态。
与AQS一样,当线程竞争资源时。
状态值已更改。
获取线路或释放锁时;情况是灵活的。
但AQS比这个水壶更复杂。
它管理队列以确保队列安全等待和唤醒。
水壶旁边有一位同事,正要喝茶。
AQS突然想到,如果能像这个水壶一样简单就好了,但简单却会剥夺它的力量。
等等还有一件事。
我记得系统崩溃了。
当问题解决后,我发现这是由于锁争用造成的。
如果我们能再次优化AQS。
这种情况是可以避免的。