前言
不知道最近的各位,或者说从19年底开始,大家有没有发现一个问题,阿里,字节这样的公司天天招人,每天都有内部人员找上门来内推,或者猎头主动推荐,好像非常缺人的样子,但是真的自己去面试了,却发现并不是那么容易。这不,正好有一个很偶然的机会,跟阿里和字节的人员聊了一下,发现并不是中的那样。
其实,并不是非常缺人,大公司只是做正常的人才储备,和人才库建设。万一捞到一个不错和自己业务匹配的候选人,真的也非常值。
而且,很真实的一个方面,现在互联网发展快,很多技术层出不穷,尤其是这次疫情的原因,对于很多公司都造成了不少的冲击,那这个时候,人才就显得尤为重要,这也是为什当你开始开始去跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果不一定是凉凉,只是面试官对于你能力的一个界定。
现如今市场,多线程、高并发编程、分布式、负载均衡、集群等可以说是现在高级后端开发求职的必备技能。
早期的鸟儿有虫吃,现如今做开发的门槛越来越高
但是,术业有专攻,总有一些牛逼的人存在,比如“道哥”这样的,但是,作为普通人该怎么去操作呢?给大家一个建议,去面试---当然不是为了让你跳槽辞职,而是为了能看你和社会上需求的技术脱轨了多少
本人经常隔段时间就偷偷投点简历,请假出去面试几次,目的不是想跳槽,主要是为了看看市场上的技术流行趋势,顺便检验一下自己的水平,当然,如果面到了心仪的公司或者大厂,那不是更好嘛,哈哈哈!
这不,疫情刚过,听过面试挺难的,然后就在网上海投了一波,没想到其中还到了来自字节的面试通知,虽然有点小震惊,但还是用平常心对待了。经历了几轮折磨之后,结果……当然是顺利的接到了字节跳动的Offer,定级为2-2资深研发人员。
经验分享
既然今天说到了一些市面上主流的面试必问题,那今天不整理一波不是我风格啊,首先,多线程与高并发,来吧
(1)synchronized的CPU原语级别是如何实现的?(2)无锁、偏向锁、轻量级锁、重量级锁有什么差别,升级过程如何?(3)线程间通信,同机器进程间通信,跨机器进程间通信,各有什么方法?(4)下列三种业务,应该如何使用线程池:高并发、任务执行时间短的业务并发不高、任务执行时间长的业务并发高、业务执行时间长的业务(5)秒杀系统,如何能够撑住W级别TPS(淘宝最高54万TPS)?
怎么样,面对这几道问题,你什么感觉,会不会觉得,这不是为难我胖虎嘛?是我胖虎提不动刀了还是面试官飘了
其实啊,你想多了,还真的不是这样的,面试官没那个闲工夫去为难你,那问你是因为要干嘛呢?定级,对,你没听错,就是定级,他们会针对不同的工作年限提问一些看起来为难人的问题,但是,不是在为难你,只是想看一下你的能力水平,来决定你能承担什么样的任务,当年道哥黑进阿里,不就直接被“特招”啊,对吧,现在呢,道哥,多牛逼,羡慕啊
重要意见:
在找工作或者已经工作的朋友,你的技术栈一定不要仅仅是局限于你现在所能接触到的技术或者项目,多来点新颖的,符合市场需求的技术,这才是你要做的事情。毕竟,每多学一点,成功找到工作的机会就大一点。而且,那些所谓以后在工作中慢慢学习的,别想了你要相信你自己,今天的你能做的没有做,明天的你也不会做的。
常见的多线程面试题:
下面这些是我在面试别人的时候会经常问的10道多线程的面试题
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.你将如何使用threaddump?你将如何分析Threaddump?在UNIX中你可以使用kill-3,然后threaddump将会打印日志,在windows中你可以使用”CTRL+Break”。非常简单和专业的线程面试问题,但是如果他问你怎样分析它,就会很棘手。6.用Java编程一个会导致死锁的程序,你将怎么解决?这是我最喜欢的Java线程面试问题,因为即使死锁问题在写多线程并发程序时非常普遍,但是很多候选者并不能写deadlockfreecode(无死锁代码?),他们很挣扎。只要告诉他们,你有N个资源和N个线程,并且你需要所有的资源来完成一个操作。为了简单这里的n可以替换为2,越大的数据会使问题看起来更复杂。通过避免Java中的死锁来得到关于死锁的更多信息。7.你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?多线程和并发程序中常遇到的有Memory-interface、竞争条件、死锁、活锁和饥饿。问题是没有止境的,如果你弄错了,将很难发现和调试。这是大多数基于面试的,而不是基于实际应用的Java线程问题。8.为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?这是一个非常经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。现在这个问题通常在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的回答应该是这样的,当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码。但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码。9.Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?自从Java5和Java内存模型改变以后,基于volatile关键字的线程问题越来越流行。应该准备好回答关于volatile变量怎样在并发环境中确保可见性、顺序性和一致性。10.什么是不可变对象,它对写并发应用有什么帮助?另一个多线程经典面试问题,并不直接跟线程有关,但间接帮助很多。这个java面试问题可以变得非常棘手,如果他要求你写一个不可变对象,或者问你为什么String是不可变的。
多线程与高并发学习路线
需要高清大图的小伙伴只需要