简单介绍:
本人工作8年java开发,技术谈不上优秀,所以我不是技术专家。本文宗旨对比下大小公司面试,面试也是一门艺术。通过我的面试经历,如果有用你们可以借鉴。
蚂蚁金服面试过程
我这里就只针对技术,说一个深聊的技术点java并发。主要是让大家知道下大厂的面试风格,和他们的专业之处。
问题背景:(这里只列其中一个场景,说明下高水准的面试官)
面试官:简单介绍下你的项目经理吧。
作者本人:。。。。。。介绍完毕。
面试官:详细介绍一个你觉得比较重要或者你觉得对你成长比较大的一个项目,包括难点有哪些,你们如何处理的。
作者本人:xxx项目,有个考试系统,本人负责的,整个项目的设计,开发,优化。都是本人负责的。
面试官:你的答案是如何设计存储的。
作者本人:答案我们收集的页面题的答案组成的JSON字符串,这个我们实践过,存oracle的大字段,后来发现数据一多,那个表查询会非常吃力。所以后来我们选型存到的mongodb。
面试官:那简单说说mongodb的和oracle的区别。
作者本人:。。。。。。估计没说好。。。飘过。
面试官:行,这个就到这儿,你们考试的时候,你刚才说了,提交答案的时候,和进入考试的时候,流量很集中。这个时候你们采取了些什么手段。
作者本人:我们分阶段优化的,
- 第一次页面静态化,考试试卷提前静态化。
- 第二次是发现进入考试的时候服务器卡死。找到了是因为进入考试的时候做了6-7个业务表数据的join查询导致的,我们把这些需要查询的数据提前整理到一张表变成了单表查询。
- 第三次是很多人提交答案的时候卡死页面,这个时候我们加了消息队列jms
面试官:你说到你们用到了消息队列,那你们后面的消息又如何快速的处理写入到数据库的呢。
作者本人:我们后端的消息消费者,消费消息的时候 存入到map内存中。然后另外一个线程批量插入或者更新数据库。
面试官:我这样理解对吧,相当于现在有消息消费者存你那个map操作,然后另外一边是另外一个线程取这个map操作,对吧。你如何保证这个map的线程安全问题。
作者本人:我们用的CurrentHashMap,然后put操作和get操作都synchronized 保护。
面试官:synchronized这个关键字,是不是你写数据库那个线程,在读取这个map写入数据库的时候,消费者这个线程是不是挂起只能等待的?
作者本人:嗯是的。
面试官:那相当于中间假如你写数据库要1秒,那这个时候这一秒停顿时间可以想办法消除没?也就是让他更快,更高效。
作者本人:【心理暗想,幸好自己准备了下,】,我说还可以用双队列切换的思想,就是用两个mapA,mapB,一个线程存MapA的时候,线程B去处理mapB的数据,处理完了再切换告诉第一个线程去存mapB,当前线程去取mapA。这样切换。
面试官:那你简单说下代码逻辑怎么实现吧。
作者本人:就是切换方法switch加上synchronized,然后在这个方法里面 把mapA 和mapB的内存地址指向切换下。
面试官:你这里说到的还是有synchronized,synchronized是悲观锁。总有那个时刻是锁住的只能一个线程工作。对吧。还有没有更高效的办法。
作者本人:这个我还真不知道了。。。
面试官:你知道java的automatic原子变量吗?
作者本人:。。。。。这个还真没接触过。。。
面试官:因为你前面说到的锁都是悲观锁,可以用原子变量实现乐观锁,好那这个问题就到这儿。
问题思考:
1、如果是你们结合你们的项目经历,可以思考面试官会如何考察你们。
2、这是我见过的最正规的面试,首先面试官,思路很清晰,而且是层层深入考察你对知识的掌握深度和广度。这些都是值得学习的地方,包括很多小公司。
3、其次这样的面试官他会根据他面试后,得出你这个人擅长什么,对我们项目中能承担哪些职责,就有了个数。
4、当然你会的越多肯定是锦上添花,但是门门懂样样瘟,这种选手,我相信这么牛的面试官分分钟就试探出来了
5、我也去面试过很多小公司,有见过拿着笔记本记着要问哪些问题的来面试我,也有问我写不写博客的标准来衡量我的。反正活久见。
写在最后的话
大家对上面的技术场景,有更高深或者更好的意见的,我们也可以交流。我也学习学习。我的宗旨就是每个人工作经历不一样,擅长的领域就不一样。