蚂蚁金服java研发面经_java研发-蚂蚁金服-一面电面

3月22日接到的电话,约到了晚上8-10点,等了一晚上没消息,以为被鸽了,结果9点半才接到电话,聊了30分钟左右,蚂蚁的员工真敬业!

Q:自我介绍

Q:最有难度的项目

Q:对线程安全的理解

A:两个线程执行同一段代码,不会出现不可预测的结果,则认为是线程安全

Q:比如有一个局部变量i=1,两个线程同时执行,是否线程安全

A:局部变量保存在虚拟机栈,为线程独享,是线程安全

Q:比如再有一个共享变量,如何保证线程安全

A:乐观锁与悲观锁保证。乐观锁,使用原子变量,比如AtomicInteger。悲观锁,使用synchronized关键字或者ReentrantLock

Q:说说ThreadLocal,底层如何实现

A:试过用ThreadLocal+SpringAOP动态切换mysql主从数据源,实现读写分离,是一种用空间换时间的办法。底层没看过

Q:hashmap实现原理

A:hashing的原理,(具体再说put和get的工作过程)

Q:volatile关键字,解决了什么问题

A:强制主内存和工作内存的变量同步,保证了内存可见性以及有序性。(线程安全三大特性:原子性、内存可见性、有序性)

Q:类加载机制

A:(有点忘记了,简单说了下)双亲委派模型,类加载器要加载一个类,会先交给父类加载器加载,等于先通过jvm底层内存类加载器加载,防止类的重复加载,以及保证类加载的安全性

Q:jvm内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?

A:jvm内存5部分:程序计数器、本地方法栈、虚拟机栈为线程私有,堆内存、方法区为线程共享。堆分为新生代和老年代,新生代分为eden区+2个大小一样的survivor区。两个survivor区用于实现垃圾收集中的复制算法,非常高效。

Q:对象在堆内存创建的生命周期

A:先在eden区创建对象,经过一次垃圾收集之后,未被收集的对象移到survivor区,每次垃圾收集survivor区里面未被收集的对象交替移动,经过一定次数的垃圾收集之后对象移到老年代。或者一些大对象直接在老年代创建。

Q:Spring的原理?AOP的实现?

A:Spring主要是IOC和AOP两部分,AOP两种实现方式:jdk动态***和cglib(补充:区别在于,jdk动态***通过***接口,cglib通过实现子类进行***)

Q:面向对象的设计原则?OCP?

A:6个,OCP、单一职责。。。OCP是对扩展开放,对修改封闭(好难记,真不记得,就算记得也不是很理解什么意思,要找个时间专门理解一下)

Q:分布式系统如何保证数据一致性

A:(这个真不了解,碰了一下运气说一致性哈希算法)被说这是负载均衡一致性,他问的是数据一致性(后来想到两阶段提交算不算?)

Q:有一个方法接收一个消息类型数据,通过if-else处理,如何优化

A:通过工厂方法模式,工厂方法模式是工厂接口创建产品接口

Q:设计一个秒杀系统?考虑哪些问题?

A:(没什么经验,随意说了一下)数据存储,不能直接交互数据库,使用redis缓存存储;处理高并发问题,负载均衡。。。(是不是也可以提到消息队列削峰,秒杀结束处理请求直接返回静态页面)

问了消息队列,但个人不是特别了解,问了工作年限,因为觉得我基础可以,但是大型项目经验比较差劲

Q:有什么问题想问

A:问了一下自己的表现

简单记录了一下并且写了一下答案,攒人品!

面试官没有问得很深入,可能因为天色已晚,就是对于线程安全高并发比较看重是真的,整个面试过程还是聊得挺愉快,收获很大,蚂蚁的面试官还是很nice,很有耐心,引导性地提问,下一次可能就要真枪实弹地撸代码了,祝自己好运!什么消息队列,分布式数据一致性,秒杀系统,回头必须补。

希望大家都能拿到心仪的offer!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值