你好,我是田哥
一位朋友节前去恒生面试,其实面试问题大部分都是八股文,但由于自己平时工作比较忙,完全没有时间没有精力去看八股文,导致面试结果不太理想,HR说节后通知面试结果(估计是凉了)。
以下是面试遇到的问题:
以上是问题,大家不妨自己先看看自己能回答多少,如果觉得简单,那请你出门右转。
关于自我,我之前有专门分享过一篇文章,这里就不再赘述了,请参考文章:
以下是一些建议:
总的来说,回答为什么离职的问题时,要坚持诚实和积极的态度,突出个人的专业发展目标和对新机会的追求,同时要避免提及消极原因,保持中立和专业。这样能够展现出你对工作的认真态度和对未来发展的规划。
换一种问法:你觉得最有挑战的项目是哪个?
在面试中之前,建议你先梳理一下你的项目,不要等到面试现场再去边说边梳理,在面试中就会出现:
我最近做的项目是xxx,我在这个项目中主要负责xxxxx,然后,这个项目中xxxx业务是核心业务,然后,。。。然后。。。
这是我面试这么多年遇到的介绍做多的模板,各种语气词加起来都已经超过了项目介绍内容。
项目介绍一定要自己用心准备,我们尽可能的给面试官制造一下好奇的话题。
在这个项目中,我负责整体架构设计,我是这个项目负责人,我负责这个项目的核心业务,项目中用到了分布式事务,对项目组朋友的SQL进行优化,其中有一项任务就是负责项目code review,在项目开发过程中遇到了xxx、www、yyyy等问题
先搞清楚并发技术有哪些?
在项目中,常常需要处理并发请求,以提高系统的性能和响应速度。以下是一些常见的并发技术,可以用于处理并发请求:
这里举了9个,其实还可以有更多。
在实际面试中,我们要依据自己的项目进行回答,不要随便编造,不然很容易露馅,就算编制也得说出为什么要用这个技术,以及使用后的效果。
对于普通项目而言,最好说的就是线程池、消息队列、缓存,就是这些技术在非分布式微服务项目中也可以被用上。
常见分布式锁实现方式有:数据库、缓存、Zookeeper。
数据库实现:可以在数据库中创建一个表,利用数据库的事务特性和唯一性约束实现分布式锁。通过对这个表的操作来获取和释放锁。
缓存实现:利用分布式缓存存储锁的信息,比如Redis也可以利用其特性实现分布式锁,比如使用SET命令和NX(Not eXists)参数实现互斥锁,也可以使用Redisson实现的锁机制。
ZooKeeper实现:ZooKeeper是一个可靠的分布式协调服务,可以利用其临时节点和顺序节点特性实现分布式锁。可以通过创建临时顺序节点来实现锁竞争。
其实,没有谁是最好的,只有相对最适合我们的具体项目业务场景。
数据库因为受到其性能的影响,所以在实际项目中基本上很少使用。项目中大多数都偏向于Redis和Zookeeper,从性能方面来讲Redis更好,从一致性方面来说Zookeeper更好。
我们在实际项目中,不管是考虑技术本身的问题,还要考虑项目技术架构,比如:我们基本上不会因为一个分布式锁而去把Zookeeper加入进来,更多是考虑性价比,如果项目中有redis了,那我们就没有必要再去刻意引入Zookeeper。并且,在实际项目,大部分都是采用Redis来实现分布式锁。
在Java中,线程池通常由ThreadPoolExecutor类实现。ThreadPoolExecutor类的构造方法中包含了一些参数,以下是线程池中常见参数的含义:
通过合理调整这些参数,可以根据实际情况来优化线程池的性能和资源利用率,提高应用的并发处理能力。
线程池中有两种线程:核心线程和临时线程(最大线程减去核心线程的部分)
临时线程如果处于空闲状态,并到一定时间后会被清理回收。
核心线程数默认是不会被回收的,如果需要回收核心线程数,需要调用下面的方法:allowCoreThreadTimeOut 该值默认为 false。设置为true就会回收核心线程
没有
很多项目中真的是没有对线程池做监控,不知道你们项目中是否有做监控。
我们可以用一个 printStats 方法实现了最简陋的监控,每秒输出一次线程池的基本内部信息:
也可以参考美团线程池实践 ,对线程池参数动态化管理,增加监控、报警功能。
没注意,好像是用的默认。
线程池中主要有4种拒绝策略:
我们也可以根据自己项目实际情况来,自定义拒绝策略。
这个没注意具体是怎么设置的,因为是我们领导做的,不过我知道一些理论知识。
在使用线程池时,会考虑线程数如何设置,设置多少,不可能随便胡乱设置。通常会按照任务类型,最线程池中的线程做一个初步的评估;业务类通常分为两总:CPU密集型和IO密集型。
2*cpu
核数。可以先按照理论值进行测试,再通过多次的压测,找到一个相对最优的点。
synchronized实现原理主要是通过对象头中的标记位(Mark Word)以及Monitor对象来实现的。下面是synchronized实现原理的简要说明:
面试中可能会问一些synchronized的使用,修饰普通方法、修饰静态方法以及同步带模块的区别,优缺点,还有就是所得范围要清楚。
AQS是AbstractQueuedSynchronizer
的简称:AQS 是一个用于构建锁和同步器的框架,它提供了一种基于队列的同步器实现方式。通过AQS,可以相对容易地实现各种锁机制,如ReentrantLock和Semaphore等,以及自定义的同步器。
核心原理:
这个可以参考我之前的文章:和面试官吵起来了?
final
关键字有多种用途,主要包括以下方面:
修饰常量:定义常量时通常会使用final
关键字,表示该变量的值在初始化后不能被修改。例如:
final int MAX_VALUE = 100;
修饰类:使用final
修饰的类不能被继承,即为最终类。例如:
final class FinalClass {}
修饰方法:使用final
修饰的方法不能被子类重写,即为最终方法。例如:
public final void finalMethod() {}
修饰变量:使用final
修饰的变量表示初始化后不可再赋值,但对象内容可以改变。例如:
final List<Integer> list = new ArrayList<>();
list.add(1); // 合法
list = new ArrayList<>(); // 非法
修饰参数:使用final
修饰方法参数表示该参数是只读的,不能在方法内部被修改。例如:
public void print(final String str) {
System.out.println(str);
// str = "new"; // 非法
}
使用final
关键字的案例:
线程安全常量:在多线程环境下,使用final关键字定义的常量在初始化后不可修改,可以保证线程安全。例如:
public class Constants {
public static final int THREAD_COUNT = 5;
}
单例模式:使用final
关键字确保单例模式中的实例只被初始化一次。例如:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
性能优化:在编译时,final
关键字可用于对代码进行更好的优化,例如对方法进行内联替换,减少方法调用开销。
安全性和可读性:使用final
关键字可以提升代码的安全性和可读性,避免不必要的变量修改和类继承。
是不是让你长见识了,大部分人回答都只会说修饰类修饰方法修饰字段的作用就结束了。
下面举几个常见的使用场景:
理解其本质,然后再结合业务场景。
有就有,没有的话,编造需要慎重,否则容易被坑。
分库分表是一种常见的数据库水平拆分方案,通过将数据库数据按照某种规则分散存储在多个数据库实例或表中,以提高数据库性能、扩展性和容量。以下是对分库分表的一些理解:
我们也可以使用分布式数据库,比如TiDB。在实际项目中,其实很少回去做真正的分库分表,大部分项目可能会做一些分表,但是分库确实不多。分库分表基本的都是在基于现有sql优化、表结构优化、硬件提升都无法满足的情况下才会考虑的。
以下是一些常见的分布式事务解决方案:
两阶段提交(Two-Phase Commit,2PC):是一种最基本的分布式事务协议,通过协调者和参与者之间的两阶段协商来保证事务的一致性。然而2PC存在阻塞、单点故障、性能开销高等问题。
三阶段提交(Three-Phase Commit,3PC):在2PC的基础上引入了准备阶段,解决了2PC的某些问题,但仍然无法完全解决所有问题。
补偿事务(Compensating Transaction):采用补偿事务的方式,在业务处理失败后执行一系列的逆操作(补偿操作)来进行事务回滚,保证数据的一致性。
本地消息表(Local Message Table,LMT):在分布式事务中引入本地消息表,将本地事务和消息发送操作绑定到一起,保证本地事务和消息发送的原子性。
分布式消息队列:借助分布式消息队列中间件来实现分布式事务,将业务逻辑和消息发送放入同一个事务中,实现最终一致性。
TCC(Try-Confirm-Cancel):TCC是一种面向业务逻辑的分布式事务补偿机制,通过Try阶段尝试执行事务操作、Confirm阶段确认执行、Cancel阶段取消操作以实现事务一致性。
Saga模式:将一个大事务拆分成多个小事务,每个小事务有自己的补偿操作,通过一系列连续的小事务来实现分布式事务的一致性。
Seata:阿里巴巴开源的全局事务解决方案,支持分布式事务处理模式,包括AT模式(TCC)、XA模式、SAGA模式等。
以上是一些常见的分布式事务解决方案,每种解决方案都有自己的特点和适用场景,我们需要根据具体业务需求和系统架构选择适合的分布式事务解决方案。
常见的SQL优化手段在MySQL数据库中的实际应用方法:
你觉得难吗?如果你也有面试经历,或者面试中遇到不好回答的问题,请私信我或者在文章下面留言。