1. 死锁
- 简述
是一组相互竞争资源的线程,因为互相等待,造成永久阻塞的现象。 - 发生条件:
1.互斥条件
2.占有并等待
3.不可抢占
4.循环等待 - 解决方式:
1一次性获取所有的资源
2 主动释放持有的资源
3 顺序的去获取的资源
2. 反射的优缺点
- 简述
反射是java语言里一个比较重要的特性,能够在程序运行的过程中,去构造任意一个类对象;并且可以任意一个类的成员变量、成员方法和属性。通过反射,可以通过java语言动态获取程序的信息,以动态调用的能力,Java中有java.lang.reflect来实现放射相关的类 - 优点
1 增加程序的灵活性,在运行过程中对类进行修改和操作
2 提高代码的复用率
3 在运行的时候,获取类的方法和属性,通过反射来动态调用 - 缺点
1 因为动态的获取类资源,所以jvm无法对类进行优化,导致性能比非反射略低
2 代码的可读性下降
3 反射可以绕过一些限制访问的属性和方法,可能破坏代码的抽象性和产生安全性问题
3. 为什么重启equals(),必须重写hashcode()
- 简述
equals()会进行两个操作,一是使用==去比较两个对象的内存地址,不相同则去比较这两个对象的值;Java中的任意一个对象都会有native的hashcode方法,并且这个方法会在散列集合中被用到,例如往集合中存在,会使用到hashcode值计算,如果结果没有,则直接存储,否则使用equals比较(直接使用equals效率太低,所以直接使用hashcode方法)
4. 策略模式和观察者模式
两种都属于行为型模式;
策略模式主要用在根据上下文动态去控制类的行为的一个场景,一方面可以解决多个if-else的场景,另外各方面把类的不同行为进行封装,使得程序可以动态的扩展和替换,增加了程序的灵活性。
观察者模式主要用在一对多的对象依赖关系中,实现某一个对象状态变更之后的感知的一个场景,一方面可以降低对象依赖关系的耦合度,另外一方面通过这种状态通知机制,可以保证这些依赖对象之间的状态协同。
4. hashmap和hashtable的区别
都是基于hash表实现的Key-Value结构的集合
- hashtable是jdk 1.0引入的线程安全的集合类,初始容量是16,所有的方法都加了一个synchronized同步锁,内部主要使用数组加链表。链表主要用来解决hash冲突的场景
- hashmap是jdk1.2引入的线程不安全的一个集合类,初始容量是11,内部也是使用了数据加链表的结构,但是在jdk1.8的时候做了优化(红黑树,当数组的长度大于64,并且链表的长度>=8,则会转化为红黑树)
5.integer比较问题
- 自动装箱成integer对象。
- 享元模式(通过复用对象,减少对象的创建次数,从而减少内存的占用,从而提升性能)
- Integer内部维护了一个integerCache,缓存了-128-127的数值。
6.分布式事务的理解和解决方案
简述:
分布式事务是指存在多个跨库事务的事务一致性问题
解决:
目前解决方案主要有两种;
- 一种是是基于XA协议的强一致性的事务方案(atomikos和seata中的xa事务模型)
- 另一种是基于base协议下的弱一致性事务解决方案(tcc事务模型和基于可靠性消息的最终一致性方案和seata中的saga事务模型)
7.服务注册中心应该是ap还是cp
简述:cap模型:在一个分布式系统里,不可能同时满足三个点(A一致性,可用性C,分区容错性P)
回答:首先应该肯定是一个CP模型,因为注册中心首先是一个地址维护的平台,如果出现故障,不能影响服务之间的通信。第二注册中心的地址感知,本身就存在一个延迟
8.服务降级的理解
服务降级是一种提高服务稳定性和可靠性的策略。在服务器压力很大的时候,关闭一些非核心业务的。主要有两种(主动降级和基于特定情况的被动降级)
9.数据库字段建议设计not null
- 数据的完整性
- 提高查询性能
- 开发的友好性
- 数据一致性约束
10.数据库最左匹配原则
因为数据库索引B➕的索引结构决定的,优先使用第一个值按照顺序排序,然后再使用第二个值排序。
11.事务在什么场景下会失效
- 异常必须外抛,不能自己处理
- 必须走代理
12.高度为3的b+数可以存多少索引
多路平衡树:通过减少非叶子节点的存储数据量以及增加树的分支数量,降低树的高度从而减少磁盘io次数来提高数据检索性能。
b+树的高度和存的数据的多少与索引的大小和数据页的大小有关,b+树的每一个节点都是一个数据页,默认大小16k,非叶子节点存储的是索引值页的偏移量,叶子节点存储的是完整的每一行数据(一行数据大小,主键id类型占用的大小,指针大小)