作者:温安适

my.oschina.net/floor/blog/1841962

1. http get问题影射思维问题

与面试官的交流如下:

面试官:“一个http 请求,接受json数组,数组内容是id,返回用户信息,在测试上是ok的,到预生产就报错了,可能是什么问题?”

我想了想说:“代码一致吗?”

面试官:“当然”

我立刻说:“id中没有中文吧?”

面试官:“没有”

我略有疑虑的说:“是压力测试中,报的错吗?如果是可能是这个借口需要加缓存提高tps了”。

面试官微微一笑说:“不是压力测试,就是单独一次调用”。

我立刻又说:“是不是后台对应的数据库挂了。造成的?”

面试官:“不是”

我再思索中,到底是什么问题呢,左思右想没有想法,正在苦恼中。

面试官略有失望的说:“你遇到bug一般如何处理呢?”

我有种瞬间被闪电击中的感觉,原来思路比答案重要

我平静的说:“定位问题,分析问题,尝试解决,重复上述步骤直到问题解决。定位问题,一般就是先看日志”

面试官略有肯定的说;“调用者的日志,显示调用的接口是500”

我进一步说:“那提供者的日志呢?”

面试官:“提示一大长串的Id,就没有其他日志了”

我细细一想说:“这个可能是测试数据少,预生产数据多,具体不是数据库的数据问题,而是传递的id多了,造成这个查询接口返回慢,可以尝试进行拆分,分批次查询”

面试官:“这个问题,先到这里,咱们换一个问题。”

看到这里,大家可能会觉得这个问题,根本不值一提,或者说记录也是没有任何意义的。但在这里我不得不说这是一个非常严重的问题,是我底层认知中的一个重要缺陷 !在信息不足的情况下,靠猜处理问题!,上边的问题如果不是面试官打断我我会一直往下猜,这种主观片面的方式如果不改,不仅面试会碰壁,生活也会走很多弯路。

感悟1
在信息不足以判断时,应先尽量通过合理有效的沟通获取更全面的信息,而不是在信息不足的情况下贸然尝试

2.半小时只能发3次消息的问题

上边的问题如果你觉得没有意思或者觉得我小题大做,没关系,下面这问题就有意思了。

面试官:“问你个算法问题吧,如何实现半小时只能发3次消息。”

我心中窃喜这个不就是限流,得意的说:“可以适用Guava的RateLimiter”

面试官略有深意的说:"不是每10分钟1次,用户可以1分钟内发3次 "

我语无伦次的说了些方案,这里经过了至少5分钟,都不对。

面试官不耐烦的说:“你刚才提到RateLimiter,它的基本实现原理是什么?”

我深吸一口气说:“令牌桶机制”

面试官略有期待的说:“如何维护令牌的?”

我战战兢兢的说;“以1s一次为例,如果没有尝试获取令牌,每秒都会更新令牌桶中的数量为1”

面试官打断我说:“你再想想这个半小时只能发3次的问题”

我心中明白这是最后一回了,如果在答不对,等待我的就是一首《凉凉》了,但是面试官问我如何维护令牌桶干什么呢?在深思10s后,我想明白了,这个问题本质还是限流,令牌桶算法还是可以解决,只是不是定时维护令牌桶中的令牌数量了,而且每次用户调用时进行维护,并且除了了令牌本身,还需要一个时间戳来协助调整令牌。

我笃定的说:"这个问题就是限流问题,还是参照令牌桶算法,但是维护机制变了。"

面试官微微一笑说;“你说说具体如何实现呢”

我淡定的说:“简单的说,系统持有一个表,表中有1个用户id,1个int类型作为剩余令牌数,1个Date类型作为上次发送时间,具体实现如下流程图”

感悟2
经典算法,活学活用,大多数业务问题均可解决。

3.线程池运行原理

面试官看了看我的简历说:“线程池用过吧”

我信心满满的说:“当然,我们项目都是使用的自扩展的线程池,我非常的熟悉”

面试官很有期待的说:“哦,那你介绍下如何扩展的吧”

我侃侃而谈:“线程池扩展,使用的是ThreadPoolExecutor,核心参数有,核心线程数,最大线程数,存活时间,存活时间的单位,队列大小,拒绝策略,拒绝策略分为4种,”

面试官:“具体说下拒绝策略”

我心想这个小意思,昂首挺胸的说:“

  • AbortPolicy默认策略 抛出未检查的异常RejectedException

  • DiscardPolicy 新任务无法保存到队列,抛弃该任务

  • DiscardOldestPolicy 新任务无法保存到队列,抛弃下一个执行的,再提交最新的

  • CallerRunsPolicy调用者执行 不抛弃任务,不抛弃异常,而将某些任务退回到 调用者。如果队列满了,下个任务会在调用execute的主线程中执行。有界队列和调用者执行策略,实现高负载下平缓的性能降低 ”

面试官:“概念咱们就不聊了,考虑下面这个场景,核心线程5,最大线程10,队列大小2,同时来了20个任务,使用默认的拒绝策略,任务是如何被执行的。”

我心里一下就蒙了,一般线程的队列大小至少要上千,这个队列数是2,还真没设置过。扩展:200期Java面试题阶段汇总

硬着头皮,故作镇定的说:“这个最开始的5个任务会被执行,之后的2个任务会进入到队列,之后线程池新开2个线程执行队列中的任务,其他的任务都拒绝了”。

面试官:“这个问题你有点犹豫啊!”

我心里咯噔一下,哎看了是猜错了。

回家以后,我非常好奇,写了程序来校验这个问题,代码如下:

public class IndexBinarySearch<T> {public static void main(String[] args) {ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(5, 10,1,TimeUnit.MINUTES,new LinkedBlockingDeque<Runnable>(2));List<Runnable> rlist=new ArrayList<>();for(int i=0;i<20;i++){rlist.add(new RunnableTest(poolExecutor));}for(int i=0;i<20;i++){poolExecutor.execute(rlist.get(1));}}
}class RunnableTest implements Runnable{ThreadPoolExecutor poolExecutor;public RunnableTest(  ThreadPoolExecutor poolExecutor){this.poolExecutor=poolExecutor;}@Overridepublic void run() {int threadSize=this.poolExecutor.getActiveCount();int queueCurrentSize=this.poolExecutor.getQueue().size();System.out.println(Thread.currentThread().getName()+":执行开始:"+"当前线程数:"+threadSize+"当前队列大小:"+queueCurrentSize);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}
}

运行结果如下图:

从代码的运行结果上看,前5个立即执行,后2个入队列,之后线程池开新线程处理后边的任务,如上图紫色框部分线程6-10,直到到达最大线程数为止

之后的任务都拒绝了,如上图报错部分

等有线程执行完任务后,会从线程池中取之前的任务执行。如上图红色框部分。
总结下其大致流程图如下:

感悟3
只有了解原理,才能把一项技术应用在不同的场景下。

总结

3个问题3个感悟

  1. 在信息不足以判断时,应先尽量通过合理有效的沟通获取更全面的信息,而不是在信息不足的情况下贸然尝试

  2. 经典算法,活学活用,大多数业务问题均可解决。

  3. 只有了解原理,才能把一项技术应用在不同的场景下。

END推荐好文>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!>>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

记一次Java面试中遇到的三个问题及感悟!相关推荐

  1. JAVA面试中问及Hibernate与 Mybatis的对比

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  2. 分享Java面试中的几个重要基础问题

    在国内互联网企业中,Java工程师的缺口是最大的,可见Java的受欢迎程度.Java需求量大,自然竞争力也就高,如果没有足够的优势,很难在激烈的竞争中脱颖而出.根据学员们的面试反馈情况,小千整理了大家 ...

  3. Java面试中与源码有关的问题分享

    在Java面试中,相信大部分应聘者都会遇到喜欢问与源代码相关问题的面试官.要知道,现在企业都希望招聘到对技术有追求并且拥有持续学习能力的Java程序员.通过应聘者对相关问题的回答,面试官能够快速诊断他 ...

  4. java面试技术问题_11个JAVA面试中常见技术问题

    原标题:11个JAVA面试中常见技术问题 大家在平常面试java的过程中都会遇到哪些难题呢?还有一些即将去面试java的童鞋们,你们想知道技术面试中会涉及到哪些点吗?达妹为你整理Java面试中会被问到 ...

  5. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...

  6. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  7. java面试会问到的问题吗_[转载]java面试中经常会被问到的一些算法的问题

    Java面试中经常会被问到的一些算法的问题,而大部分算法的理论及思想,我们曾经都能倒背如流,并且也能用开发语言来实现过, 可是很多由于可能在项目开发中应用的比较少,久而久之就很容易被忘记了,在此我分享 ...

  8. (免费领取Java面试题)Java面试中经常被问到的问题

    (免费领取Java面试题)Java面试中经常被问到的问题 免费领取Java面试题 -------------https://blog.csdn.net/kaikeba/article/details/ ...

  9. 如何在java面试中给出一个出彩的自我介绍

    自我介绍是java面试中一个必不可少的环节,一个出彩的自我介绍,可以给面试官留下好的印象,帮助你拿下心仪的offer,但是很多初级程序员都不知道如何去做自我介绍, 甚至有些工作了很多年的程序员面试时的 ...

最新文章

  1. Ardino基础教程 8_模拟值
  2. C#中的构造方法与对象初始化器
  3. __attribute__((packed))
  4. 类的初始化(构造函数)
  5. VUE 解决:Property or method “deleteFun“ is not defined on the instance but referenced during render.
  6. 【华为云 ModelArts-Lab AI实战营】第三期:图像分类 (III) 模型参数网络调优
  7. 微信手机开发 ios android 您没有APP支付权限
  8. 老程序员应该记住的 5 件事
  9. 揭秘黑石、橡树等巨头的不良资产赚钱术
  10. 基于Java毕业设计优课网设计与实现源码+系统+mysql+lw文档+部署软件
  11. 两步搞定经验模态分解与离散小波变换
  12. C++ 找朋友(friends)
  13. 虚拟化系列-Windows server 2012 Remote桌面与应用
  14. Katalon Recorder使用教程—安装
  15. WIN11安装子系统
  16. php 读取并显示doc,PHP读取doc,docx,xls,pdf,txt内容
  17. 2023年电工杯数学建模AB题思路分析
  18. Gym - 101485G NWERC2015 G Guessing Camels
  19. layui 单元格事件
  20. “碳”零排放是什么意思

热门文章

  1. 王思聪欠款1.5亿成被执行人 孙宇晨:我帮你还钱!
  2. 卸任后的马云“忙”坏了,健美大赛、蹦迪、修空调、种蘑菇,真相看懵了
  3. “嘲羊群众”词条视频惹怒粉丝 百度知道向张艺兴道歉...
  4. 苹果发布新版iOS12.3:高通专利功能回归
  5. 韩国造智能手机时代走向终结:昔日巨头纷纷关闭生产线或削减产量
  6. 宁德时代预计一季度净利润超9.9亿元 同比增长超140%
  7. 手机存储不足怎么办?用好这份清理指南你的手机还能再战三年
  8. 李楠:《流浪地球》抄的经典套路 但这不是贬低
  9. 条件复杂的sql语句查询
  10. html怎么移动到vue,vue自定义指令之拖动页面的元素