你好,我是 yes。java
这篇文章我想谈谈如何在面试官前面吹牛P。web
我给了六个案例,教你如何把 B 格提上去。面试
这篇文章的灵感来自于一个读者,他在群里@了我。算法
我一看,确实啊!缓存
首先 “几个 offer” 说明关于 Synchronized 的面试题很常见。安全
而后从 “面试官和我争” 能够看出,确实不少人的理解是错的。微信
而后你再从 JVM 源码层面和他说说,这面试不就妥了?网络
若是我是面试官,这候选人透露出来他看过 JVM 代码,而且还发现了书上的错误,说的有理有据的,这 level 不就上来了?并发
这面试不就稳了?app
就是这篇关于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。
因此不要错过个人文章哟,可能每一篇都是装23的机会。
由于微信推送机制,文章可能没法及时送达,因此加个星标,文章必会及时推送~。
唉,再这样下去,我怕和半佛老师同样,成为一个天天在镜子面前给本身磕头的硬核男人。
我是 yes,从一点点到亿点点,咱们下篇见。
本文分享自微信公众号 - yes的练级攻略(yes_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。