跳槽入职字节跳动,给到 20k*16 薪,只因比别人更懂多线程与高并发
前言
当你开始开始去跳槽面试的时候,明明只是一份 15K 的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是凉凉;现如今市场,多线程、高并发编程、分布式、负载均衡、集群等可以说是现在高级后端开发求职的必备技能。
早期的鸟儿有虫吃,现如今做开发的门槛越来越高
但是,术业有专攻,总有一些技术牛逼的程序员可以吊打、碾压面试官!
本人经常隔段时间就偷偷投点简历,请假出去面试几次,目的不是想跳槽,主要是为了看看市场上的技术流行趋势,顺便检验一下自己的水平,当然,如果面到了心仪的公司或者大厂,那不是更好嘛,哈哈哈!
前段时间收到了字节跳动的面试,虽然有点小震惊,但还是用平常心对待了。结果一不小心,面试的时候就吊打了面试官。
前后一个半小时的面试过程全程没卡壳,项目和算法全部搞定,甚至聊到了面试官的盲点…
结果……当然是顺利的接到了字节跳动的 Offer,定级为 2-2 资深研发人员。
个人经历
其实我有好长一段时间没有正规的面试过了。三年前从数云换到 GIO 的时候,因为简历上的相关技术太过于匹配,所以基本上就和 CTO 聊了聊就确定过去了;后来再回数云的时候,也就和总监喝了一下咖啡就回来了。也就是大约 5 年的时间里面,我没有正规地接受过面试。
所以在准备投字节跳动之前,我投了几个公司做了一下热身活动。记住,这个时候其实不需要有啥心理包袱。因为本身候选人面试成功的可能性比较低,一个合适的可以面试的人选他们也很乐意看看,而且万一你确实想换工作,但是心仪的公司面不上,而热身活动的公司拿到了 offer,你也可以考虑考虑去看下。并且这个时候你没有任何的心理包袱,因为反正你也就是来面试看看的,所以面试时候的发挥可能也会更好点,因此说不定最终拿的 offer 会比最后想去的那家更好呢?
经验分享
面试时被问到了一些并发相关的问题,看看大家能否答出来:
(1)synchronized 的 CPU 原语级别是如何实现的?
(2)无锁、偏向锁、轻量级锁、重量级锁有什么差别,升级过程如何?
(3)线程间通信,同机器进程间通信,跨机器进程间通信,各有什么方法?
(4)下列三种业务,应该如何使用线程池:
高并发、任务执行时间短的业务
并发不高、任务执行时间长的业务
并发高、业务执行时间长的业务
(5)秒杀系统,如何能够撑住 100W 级别 TPS(淘宝最高 54 万 TPS)?
如果平时只有 CRUD 的经验,不了解多线程与高并发,面对这样面试题,大概率一头雾水。
其实,很多面试官都清楚,初级程序员对于多线程的掌握度几乎为零。但是面试环节中,很多面试官都会抱着试一试的态度去提问一两道多线程的题目。其目的不是为了难为面试者,也不是为了彰显面试的“高大上”,而是为了区分一般人才与优质人才。最后一点大家谨记:
在找工作的时候,除了做些相关面试和准备熟悉以前做的项目之外,还应该学习新的知识。毕竟,每多学一点,成功找到工作的机会就大一点。而且,IT 这行,技术发展过于快速,如果没有学习新知识的动力,终究会被淘汰。
你要相信你自己,今天的你能做的没有做,明天的你也不会做的。
*******************************************************
《多线程与高并发》《MySQL 王者晋级之路》《亿级流量网站架构核心技术》《图解 Java 多线程设计模式》《Tomcat 架构解析》《Java 核心知识》《Java 面试宝典》《可伸缩服务架构》、《Java 编程思想》
常见的多线程面试题:
下面这些是我在不同时间不同地点喜欢问的 Java 线程问题。我没有提供答案,但只要可能我会给你线索,有些时候这些线索足够回答问题。
1.现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?
这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用 join 方法实现。
2.在 Java 中 Lock 接口比 synchronized 块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户些,以此来保持它的完整性,你会怎样去实现它?
lock 接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像 ConcurrentHashMap 这样的高性能数据结构和有条件的阻塞。Java 线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下 Locks,因为当前其大量用于构建电子交易系统的客户端缓存和交易连接空间。
3.在 java 中 wait 和 sleep 方法的不同?
通常会在电话面试中经常被问到的 Java 线程面试问题。最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。Wait 通常被用于线程间交互,sleep 通常被用于暂停执行。
4.用 Java 写代码来解决生产者——消费者问题。
与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在 Java 中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。
5.你将如何使用 thread dump?你将如何分析 Thread dump?
在 UNIX 中你可以使用 kill -3,然后 thread dump 将会打印日志,在 windows 中你可以使用”CTRL+Break”。非常简单和专业的线程面试问题,但是如果他问你怎样分析它,就会很棘手。
6.用 Java 编程一个会导致死锁的程序,你将怎么解决?
这是我最喜欢的 Java 线程面试问题,因为即使死锁问题在写多线程并发程序时非常普遍,但是很多候选者并不能写 deadlock free code(无死锁代码?),他们很挣扎。只要告诉他们,你有 N 个资源和 N 个线程,并且你需要所有的资源来完成一个操作。为了简单这里的 n 可以替换为 2,越大的数据会使问题看起来更复杂。通过避免 Java 中的死锁来得到关于死锁的更多信息。
7.你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?
多线程和并发程序中常遇到的有 Memory-interface、竞争条件、死锁、活锁和饥饿。问题是没有止境的,如果你弄错了,将很难发现和调试。这是大多数基于面试的,而不是基于实际应用的 Java 线程问题。
8.为什么我们调用 start()方法时会执行 run()方法,为什么我们不能直接调用 run()方法?
这是一个非常经典的 java 多线程面试问题。这也是我刚开始写线程程序时候的困惑。现在这个问题通常在电话面试或者是在初中级 Java 面试的第一轮被问到。这个问题的回答应该是这样的,当你调用 start()方法时你将创建新的线程,并且执行在 run()方法里的代码。但是如果你直接调用 run()方法,它不会创建新的线程也不会执行调用线程的代码。
9.Java 中的 volatile 关键是什么作用?怎样使用它?在 Java 中它跟 synchronized 方法有什么不同?
自从 Java 5 和 Java 内存模型改变以后,基于 volatile 关键字的线程问题越来越流行。应该准备好回答关于 volatile 变量怎样在并发环境中确保可见性、顺序性和一致性。
10.什么是不可变对象,它对写并发应用有什么帮助?
另一个多线程经典面试问题,并不直接跟线程有关,但间接帮助很多。这个 java 面试问题可以变得非常棘手,如果他要求你写一个不可变对象,或者问你为什么 String 是不可变的。
多线程与高并发学习路线
需要高清大图的小伙伴只需要关注+转发,【戳戳这里】即可~
针对性的了解相关的知识
《多线程与高并发》这两大块儿是现在面试问的越来越多,也是相对一个初级的程序员向中高级迈进的必须要踏过的一个坎儿。这本书带你将多线程的知识系统化,帮助你理解多线程在 CPU 层级的实现,以及这些实现如何一层一层的映射到那些上亿用户,千万 QPS,百万 TPS 的系统。
横扫一切关于多线程的问题,吊打所有敢于提问并发问题的面试官。
这本多线程与高并发把每个知识点解析的很深,对大家应该很有帮助,它把大部分的知识集结在一起深入的解析出来(非常建议大家看一看)
放在最后
总的来说,自己如果有想要去的大公司,一定要提升好自己,让自己的能力和素质与公司匹配的上,我也一直相信,机会永远是留给有准备的人。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
以上学习资料均免费放送,最后祝愿各位身体健康,顺利拿到心仪的 offer!
评论