有时候我也在想,现在真的很卷吗?大部分人第一次模拟面试结束,给我的感觉不像大家说的那么卷。
奇怪的现象
我在做模拟面试的过程中,无意中发现一个现象,就是如果问八股文,问知识点,在校生或刚刚毕业不久的,回答的斗殴挺好的,往往是工作三五年的在这一块非常欠缺。
我也私下问过很多人,为什么这种现象,主要原因差不多就是:
-
每天太忙,没时间学习
-
年纪大了,记不住
-
就是不要想学
工作三五年的也不是就真的没有优点,他们的优点就是有大量的项目经验。换着问项目业务和设计之类的,他们明显占优势,但,问他们稍微往深的问,就会懵逼。比如:你们项目中使用到了Redis
,用来干嘛,他们能立马回答上来。
如果继续追问:如何保证Redis
和数据库中的数据一致性?然后就会稀里糊涂的回答。还有就是问他们Redis
的持久化方式使用的是哪种?“这个没注意,不是我安装的”,继续问:那你觉得哪种方式更好,答案各种各样的都有。
总结起来就亮点:
-
学生或新人,八股文占优势(也有一部分啥都不知道,啥也没去背的)。
-
三五年有项目经验,但大部分都停留在用上面,稍微问题问题就容易暴露自己的家点(也有一小分部知道的比较多)
在模拟面试的时候,我问过很多人是否在项目中用过并发编程的相关技术,用了什么?
基本上都回答:用过线程池
好吧,接下来,那我们就以一个线程池的面试题来对比以上两类人的回答。
聊聊线程池
线程池核心参数
学生或新人:基本上都是一口气就能吧这些参数回答上来,另外有部分优秀的会对这些参数做一个解释。
三五年的:部分人能全部回答出来,一部分人能说出核心线程数、最大线程数,其他参数就吱吱呜呜的回答,还有一部分就是完全一脸懵逼。
我们来看看到底有哪些参数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
-
corePoolSize
:核心线程数 -
maximumPoolSize
:最大线程数 -
keepAliveTime
:空闲时间 -
unit
:空闲时间单位 -
workQueue
:阻塞队列 -
threadFactory
:线程工厂 -
handler
:拒绝策略
问核心参数时,至少要回答corePoolSize
、maximumPoolSize
、workQueue
、handler
。还是建议全部回答吧,反正也没几个参数。
线程池原理
学生或新人:按照八股文来回答一番,甚至有的在回答核心参数的时候,顺带着就会把线程池的原理给说了(刚刚遇到能说的,就顺带着多说点)。
三五年的:有部分人也会按照八股文上的来回答,有部分人是吱吱呜呜的,不知道在说啥,还有一分部人就是瞎说咯。
关于线程池原理,我这里借用网上一张图:
如果看图记不住,我也有办法,我们可以使用生活案例来理解。
-
公司A:线程池
-
公司A自己的员工:核心线程数
-
公司A接到的订单:我们的业务线程
-
公司A的仓库:阻塞队列
-
公司B派的人:最大线程数
开始表演:
公司A接到订单,先给自己员工处理,如果自己员工处理不来了,就丢到公司A仓库里,如果仓库堆满了,这时候就去找公司B,公司B就派人(最大线程数)到公司A,订单持续爆棚,公司B派来的员工和公司A的员工都搞不来了,那就只能把后面来的订单拒绝掉(拒绝策略)。如果公司B的员工在公司A里吧任务做完了,闲着没事了,公司A也不会立马就让人家回公司B,毕竟人员来回还是有成本的,所以,可以适当的给点时间(
keepAli