目录
- 前言
- 1.死锁的定义和产生条件
- 2.MySql 中索引是什么?有什么优点和缺点?
- 3.请你介绍一下数据库的ACID
- 4.MySql 的事务隔级别
- 5.Spring 的事务管理
- 6.能说说什么是 IOC 吗?
- 7.说一下类加载机制
- 推荐专栏
前言
最近又到了找实习热门时间,每天坚持更新Java
实习岗位相关的面试题,不仅是自己学习总结,也为了帮助大家一起准备,每天进步一点点,坚持不懈,水滴石穿,一起拿下offer
。
1.死锁的定义和产生条件
死锁的定义:指两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种相互等待的现象,若无外力作用,它们都无法推进下去,此时称系统产生了死锁。
死锁产生的条件:
- 1.互斥条件:每个资源每次只能被一个进程使用
- 2.不剥夺条件:进程已经得到的资源在使用完之前,不能被剥夺,只能由自己完成释放
- 3.请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源被其他进程占用,则会进入请求阻塞,且对自己已有的资源不会释放。
- 4.循环等待条件:指在发生死锁时,必然存在一个资源的环形等待链,比如p0等待p1占用的一个资源,p1等待p2占用的一个资源…pn等待p0占用的一个资源。
以上四个条件为死锁发生的必然条件,缺一不可。
2.MySql 中索引是什么?有什么优点和缺点?
索引是一种帮助 Mysql
高效获取数据的数据结构,一般来说索引很大,并不会全部存储在内存中,一般以索引文件的形式存储在磁盘中。索引的作用可以看做类似书的目录。
索引主要有普通索引、唯一索引、主键索引、外键索引、全文索引、复合索引几种。
一般索引指的都是 B+ 树结构组织的索引。
索引的优点:
- 1.大幅提高系统性能,能大幅提高匹配where条件的检索效率
- 2.降低查询中分组和排序的时间。
- 3.通过索引具有的唯一性,可以保证数据库表中的每一行数据的唯一性
索引的缺点:
- 1.索引的存储需要占用磁盘空间
- 2.在插入、更新和删除时,对于操作列的索引也需要被更新,需要维护成本。
3.请你介绍一下数据库的ACID
事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。
事务需遵循ACID四个特性:
- 1.原子性:事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
- 2.一致性:数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
- 3.隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见的。
- 4.持久性:一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
4.MySql 的事务隔级别
事务的隔离级别有:未提交读,已提交读,可重复读,串行化四种隔离级别。 数据库多个事务同时执行时可能造成事务的一致性问题:脏读,不可重复读,幻读; 已提交读可以解决脏读的问题:脏读就是线程A修改一个数据,没有提交,线程B读取了这个修改的数据之后线程A回滚,线程B读取到的数据就变成了脏数据。 可重复读可以解决脏读和不可重复读的问题,不可重复读就是事务A多次读取一个数据,事务B在A读取的过程中进行了修改,导致事务A多次读取到的数据不一致。 串行化可以同时解决者三个问题,幻读就是事务A对一个表进行读取,事务B在A读取的时候增减或者删除数据,导致事务A读取到的数据并不一致。使用串行化的话效率较低。
5.Spring 的事务管理
Spring
中支持两种事务编程模型,一种是编程式事务,一种是声明式事务。
- 1.编程式事务
Spring
提供了TransactionTeplate模板,利用模板我们可以通过编程的方式实现事务管理,而无需关心资源获取,复用,释放事务以及异常处理,编程式事务用法麻烦,但是可以事务管理的范围控制得更加精准; - 2.声明式事务
声明式事务管理是Spring
事务管理的亮点,它允许我们通过声明的方式,在IoC配置中指定事务的边界和事务属性,Spring
会自动在指定的事务边界上应用事务属性。相对于编程式事务来说,这种方式十分的方便,只需要在需要做事务管理的方法上,增加@Transactional注解,以声明事务特征即可。
另外,在@Transactional注解上,我们可以使用isolation属性声明事务的隔离级别,使用propagation属性声明事务的传播机制。
6.能说说什么是 IOC 吗?
IOC
,也称为控制反转,一种编程思想,不再主动去new对象,交给Ioc容器去完成,想要使用就只需要从容器中进行获取即可,降低了对象间的耦合性。DI
(依赖注入)是IOC
的一种实现。主要方式有构造器注入,setter注入和接口注入。实际开发中通常使用@Autowired和@Resource注解实现依赖注入。@AutoWired是Spring的注解只能在Spring中使用,默认采用类型匹配的方式,可以通过配合@Qualifier实现名称匹配。@Resource是JDK自带的注解,Java标准,适用于大部分框架,默认是名称匹配,匹配不到了进行类型匹配,还匹配不到就抛出异常
7.说一下类加载机制
一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析三个部分统称为连接,而前五个阶段则是类加载的完整过程。
- 在加载阶段JVM需要在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。
- 验证阶段大致上会完成下面四个阶段的检验动作:文件格式验证、元数据验证、字节码验证、符号引用验证。
- 准备阶段是正式为类中定义变量(静态变量)分配到内存并设置类变量初始值的阶段,这些变量所使用的内存都应当在方法区中进行分配。
- 解析阶段是Java虚拟机将常量池内的符号替换为直接引用的过程。
- 类的初始化阶段是类加载过程的最后一个步骤,直到初始化阶段,Java虚拟机才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。