2021-08-19

本文记录了一位94年程序员的面试经历,包括万达金融和一家不知名甲方公司的面试。面试中涉及了redis应用、分页查询、kafka消息有序性、线程池原理以及锁升级等技术问题。尽管部分回答不尽如人意,但这些经历提醒面试者要对常见问题有更深入的理解和准备。
摘要由CSDN通过智能技术生成

2021年8月19号题记

身为一个94年的三年菜鸟程序员对于每天浑浑噩噩码业务代码无聊日子开始通过不断面试突破下自己~
希望每次的总结也能给自己带来一丝丝希望

一 万达金融面试
起初本着做过金融相关的工作经历投递来线下面试,面试官应该是个项目leader。听我简洁介绍工作经历后,直接问了每段工作经历中,遇到最记忆深刻的问题解决~估摸累积公司有点多了,想听我说一说个别拿手的地方。虽然没想到但是还是说了上家公司分区分线程优化地方,可能描述太业务化,这点以后一定要注意以后要偏重技术,他开始问基本技术框架 ,简洁了下上家银行的的springbach框架,似乎描述不太专业,他也挺蒙后面一定要注意简述以及上网准备下这个框架~紧接着问些金融业务核实实际工作内容就草草结束了。
总结,没了后续,准备不太充分,这次面试官也没偏重技术问,注重些以前的场景深入看法的确需要深思当时没深入研究。

二 不知名甲方 线上面
线上语音面,听完简介后直接开始技术问题。
1.redis的现公司应用场景。听过缓存穿透以及说下对策
答 用于一些查询数据缓存,以及订单进业务代码前加个标记避免重复。缓存穿透是当对应key没有数据然后去查对应数据库,数据库也返回空这样失去了缓存的价值。解决办法布隆过滤器将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力也可以对数据库查空的继续缓存设置个短时间过期时间。
2 redis的分页查询
答 着实不会当时,后来查阅和redis的存储结构 zset有关 通过SortedSet的zrevrange topicId (page-1)×10 (page-1)×10+perPage指令可以实现分页功能。

3.kafka怎么控制消息有序性

答 可以设置1个Topic(主题)只创建1个Partition(分区),这样生产者的所有数据都发送到了一个Partition(分区),保证了消息的消费顺序。或者第二种生产者在发送消息的时候指定要发送到哪个Partition(分区)。 有且只有一个partition根据业务需要,需要顺序的 指定为同一个partition,其实就是 round robin算法 随机生成个整数和分区取余获取分区数

4 kafka的groupid
goup.id是为了避免数据被重复使用group的话,连接时带上groupid,topic的消息会分发到10个consumer上,每条消息只被消费
5 线程池类
常用
newFixedThreadPool
创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。另外三种
newSingleThreadExecutor
newSingleThreadScheduledExecutor
newScheduleThreadPool

6 线程池原理
线程池任务,线程池也不会马上执行它们。

2、当调用 execute() 方法添加一个任务时,线程池会做如下判断:

a. 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;

b. 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列。

c. 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;

d. 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了”。

7.锁升级 以及valatile锁
一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率

volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令,lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
(1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
(2)它会强制将对缓存的修改操作立即写入主存;
(3)如果是写操作,它会导致其他CPU中对应的缓存行无效

8 hashmap原理以及红黑树

最后面试结束了 面试官对很多答案并不满意 后面对于常见问题一定要熟练回复
第三家 怪兽充电还是挺专业的一直围绕项目构建和思路后面有机会再细谈吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值