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!