看我如何在面试官前吹牛 P
你好,我是 yes。
这篇文章我想谈谈如何在面试官前面吹牛 P。
我给了六个案例,教你如何把 B 格提上去。
这篇文章的灵感来自于一个读者,他在群里 @了我。
我一看,确实啊!
首先 “几个 offer” 说明关于 Synchronized 的面试题很常见。
然后从 “面试官和我争” 可以看出,确实很多人的理解是错的。
然后你再从 JVM 源码层面和他说说,这面试不就妥了?
如果我是面试官,这候选人透露出来他看过 JVM 代码,并且还发现了书上的错误,说的有理有据的,这 level 不就上来了?
这面试不就稳了?
就是这篇关于Synchronized的一个点。
提升 B 格的时候到了。
想想看,当面试官问你看过什么源码呀?
你答:我看过 JVM 关于 Synchronized 的源码,我发现网上有好多理解都是错误的...阿巴阿巴。
安逸得惨咯!
这么一想,我发现我写过的文章还有好多可以装 23 的地方!
比如这篇:从Dubbo源码到CPU分支预测之旅
面试官问:看过 Dubbo 源码嘛?
你答:看过,我之前看源码的时候还发现了一个很奇怪的地方,有个地方 if 和 switch 结合着用。
我就很奇怪,所以我就用 benchmark 跑了跑,试了试 if 和 switch 的执行效率。
我发现全 if 的效率是最高的。
于是我又反编译了代码。
我发现 switch 是通过查表直接拿索引去访问的,而 if 是每次都会取出变量和条件进行比较。
那不是应该 switch 的效率最佳吗?
带着疑问的我继续查阅资料,后来我发现原来是 CPU 分支预测(详细看上面文章)搞得鬼,所以 Dubbo 的源码才会这样写。
你看,这一波下来,你这表现满分啊!
会主动看源码!
会用示例跑(动手)。
会反编译比较,钻研(动手)。
最后到底层 CPU(6666)。
这一套下来?面试官不要你要谁?
再比如这篇:炸了!一口气问了我18个JVM问题!
面试官:你平时看什么书呀?
你答:我看过《深入理解 Java 虚拟机》,我还发现了一个错误呢。
面试官:什么错误呀?
你答:不是因为“Con-current Mode Failure”而导致 Full GC ,而是因为发生了 Full GC 所以抛这个错。
我当时好奇看了看 CMS 的源码,我发现.....
后续不贴了,之前的文章写的很清楚了,也是从源码上找证据。
面试官一听,这小伙子看书就算了,因为想钻研还去看源码,源码不仅看进去了还看出错误?
不仅热爱学习还有钻研精神,我要给他发 offer!!!!
再比如这篇:Kafka索引设计与二分查询与底层缓存
面试官:你看过 Kafka 源码嘛?
你答:看过。
当时看到了 Kafka 索引的设计,采用了稀疏索引,利用二分查找来加快搜索速度。
但是我从源码发现这个二分查找是变型的,因为就消息队列的特性而言,索引数据都是在文件末尾追加的写入的,并且写入的数据基本上会立马被读取。
也就是说数据热点集中在尾部,而操作系统又是根据 LRU 来管理内存页的,所以标准的二分会导致缺页中断的情况发生,所以 Kafka 巧妙的采用了冷热分区来实现变型的二分查找。
你看看,这一波下来,面试官大拇指不给你给谁?
看过源码, 懂得基本算法,理解消息队列尾部热点特性,晓得操作系统 LRU 来淘汰内存页,啧啧!
面试官对你说:
面试官:让你设计一个连接池你怎么设计?
你答:我之前看过 HikariCP 的源码。
重点就是无锁设计,因为连接池是读多写少的场景,所以可以利用 CopyOnWriteArrayList 来存储连接,然后再利用本地化存储的思想来减少竞争。
获取连接的流程:
先去 ThreadLocal 找之前用过的连接,找到则直接返回。
如果找不到就去 CopyOnWriteArrayList 实现的 sharedList 里面找连接(这里还有个窃取的概念),如果找到则返回。
如果找不到则用 SynchronousQueue 等待连接,超时则返回 null。
再详细就看上面文章吧。
怎么说?
一般的回答,估计也就会说个加锁保证线程安全。
好点的,说个读多写少场景,用个写时复制。
你这波无锁+写时复制+本地资源加速缓存+SynchronousQueue 无缓存等待队列。
如果你觉得还不够细,那就再说说 HikariCP 的 FastList,它优化了 ArrayList。
ArrayList 每次 get 都会有范围检查,并且 remove 是从前往后遍历的。
而在连接池这个场景每次 get 范围检查没有必要,并且 remove 的时候从后往前遍历更好。
够不够细?
我细到 ArrayList 的 get 的范围检查我都要计较!(HikariCP 不愧是最快的)
面试官可能在角落里瑟瑟发抖。
再比如这个:RPC 核心,万变不离其宗
面试官:让你设计一个 RPC 框架你怎么设计?
你答:容我想想(假装思考,其实小宇宙就快忍不住爆发了)。
RPC 框架基础的核心其实就这么几点:
动态代理(屏蔽底层调用细节)
序列化(网络数据传输需要扁平的数据)
协议(规定协议,才能识别数据)
网络传输(I/O 模型 BB 一下,一般用 Netty 作为底层通信框架即可)
注意,上面加粗的其实二字,一定要说,要注意语气,要显得你游刃有余,低调奢华。
当然上面只是基础核心,生产级别需要注册中心作为服务的发现、路由分组、负载均衡、异常重试、限流熔断等。
更详细的就看上面的文章吧~
面试官已经躲在角落里瑟瑟发抖了。
再比如.....
比如不了了,太多了!
我写这篇文章的时候,我发现电脑屏幕竟然越来越高。
原来,是我慢慢地从椅子上滑了下去....
我怕我再举几个例子,我要给自己跪下了。
我时常会看看自己写的文章。
然后,默默在心里念叨这家伙真滴牛 P。
再这样下去,我怕和半佛老师一样,成为一个每天在镜子面前给自己磕头的硬核男人。
欢迎关注我的公众号【yes 的练级攻略】,每周保证至少分享一篇原创技术文。
我是 yes,从一点点到亿点点,我们下篇见。
版权声明: 本文为 InfoQ 作者【yes】的原创文章。
原文链接:【http://xie.infoq.cn/article/7f2acbc54fc67aa858cb9824f】。文章转载请联系作者。
评论