蚂蚁国际Java后端笔试&一面(社招)
0.笔试
形式:线上笔试。
笔试题就一道,是一个多线程编程题:二十个银行账户,每个账户初始余额10000元。有十个线程,每个线程每次随机从二十个账户中选取两个进行转账,转账金额是1-100中的任意一个正整数(比如账户1给账户7转了47元),每个线程转账一百次。转账完毕后,打印每个账户的余额。
思路:创建两个类:账户类Account、转账类TransferThread。Account类实现转账方法(transfer),用静态对象锁确保原子性和避免死锁。还包含id和balance属性,分别表示id和余额。TransferThread类继承Thread类,并实现run方法:for循环中随机生成两个账户(不能相同)进行转账。main方法中初始化Account类和TransferThread类的实例,启动,并使用join方法确保所有线程执行完毕再打印。
1.一面
在笔试完成后的两天进行,在线视频面试,耗时约38分钟。问题如下:
(1)自我介绍
(2)简历上的项目的流程是什么?(介绍项目的用户使用流程和后台大致的业务逻辑)
(3)项目所用的技术栈有哪些(提到了Nacos)?服务注册和服务配置,从CAP理论的角度看,二者有差别吗,更应看重可用性还是一致性?在什么情况下应该追求一致性牺牲可用性,什么情况下反过来?
(4)为什么用RabbitMQ作为消息队列?项目中用到消息队列的场景有哪些?使用手动确认消息的出发点是?
(5)用过事务型消息吗(与分布式事务不同)?介绍一下分布式事务锁的应用场景。
(6)MySQL优化方式有哪些?MySQL有哪些锁?在项目中的优化效率有多高?如果实在避免不了使用like模糊查询,该怎么办?
(7)介绍了一下布隆过滤器。
(8)ElasticSearch,项目中是如何把数据上传到其索引库的,如何更新的?如果MySQL数据库更新了,ES索引库是否会自动更新?介绍一下ES的倒排索引?ES使用时间长了,会产生数据碎片,你知道ES如何解决这个问题吗?对ES的了解程度有多深?只是使用过(还写过一些DSL语句)?
(9)Seata的几种工作模式介绍一下,介绍一下AT模式的回滚。
(10)场景题:多线程环境下,依次打印同一个数字num,要求每次打印严格加一,有哪几种实现的方式?(使用synchronized加对象锁,使用Reentrantlock锁,使用线程池规范线程顺序)
(11)项目中用到了CompletableFuture进行异步编排,介绍一下具体的应用场景,有没有其它的实现方式?(答的消息队列)
(12)了解过AQS、Condition吗?(之前了解过,忘记了)了解Java的Wait/Notify吗?(不了解)
(13)反问:工作地点?业务技术栈(纯Java相关),主业务(境外信贷金融业务)。
感受:应加深Seata的学习,学习面试中未了解的技术,进一步熟悉所做的项目,对简历中项目涉及的技术栈再进一步熟悉。
后续:一面没过。
#Java##蚂蚁集团##蚂蚁##后端##社招#记录本人的社招经历。

