基础面试总结(三)

一、线程和进程有什么区别?

进程:是程序的一次执行过程,或者说是一个正在运行的程序,是资源分配的最小单元,系统会在运行时为每一个进程分配不同的内存

线程:是程序的一次执行路径,也是调度和执行的最小单元,每个线程都有独立的运行栈和程序计数器,线程切换的开销比较小

一个进程中的线程共享内存单元,线程间的通信很高效,但是多个线程共享系统资源可能会造成安全隐患。

二、线程的创建方式,哪种最好?

创建方式:

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口
  • 使用Executor工具类创建线程池

优先使用实现Runnable的方式,因为实现的方式没有单继承的局限性,实现的方式更适合处理多线程共享数据的情况,Thread类本身就实现了Runnable接口,而与Runnable接口相比,Callable接口功能更强大,Callable接口是实现的是call方法,call方法可以有返回值,并且可以抛出异常,还支持泛型的返回值。

创建线程池的方式适合用在高并发环境下,思路是创建好多个线程放入线程池中,使用时直接获取,使用完放回线程池中,可以避免重复创建和销毁,提高响应速度、降低资源消耗、便于线程管理,并且提高线程的复用性和程序执行的性能。

三、线程的阻塞方式有哪些?有什么不同?

sleep():让当前线程阻塞指定的时间,时间到了线程结束阻塞状态

wait():线程阻塞,并释放同步监视器 notify()唤醒被wait 的线程,先唤醒优先级高的 notifyAll()唤醒所有wait的线程

join():在线程a中调用b的join方法,线程a就会进入阻塞状态,线程b执行完毕后线程a才会唤醒

等待同步锁:线程阻塞 获取同步锁:唤醒线程

suspend():阻塞线程 resume()唤醒线程

sleep() 和wait()的异同:

  • 两个方法声明的位置不同,sleep()声明在Thread类中,wait()方法声明在Object类中
  • 调用的要求不同:sleep()可以在任何需要的场景下调用,wait()方法必须在同步代码块中或者同步方法中调用
  • 如果两个方法都使用在同步代码块或者同步方法中,sleep()不会释放锁,而wait会释放

四、数据库锁的分类

InnoDB支持表锁、行锁,还支持事务,MyISAM支持表锁

表级锁:开销小,加锁快;不会出现死锁;锁的粒度比较大,发生冲突的概率最高,并发度最低

行级锁:开销大,加锁慢;会出现死锁;锁的粒度最小,发生锁冲突的概率最低,并发度也最高

页面锁:开销和加锁的时间介于表锁和行锁之间,会出现死锁;粒度介于表锁和行锁之间,并发度一般

MyISAM可以使用表级锁,有两种模式:

读锁、写锁

    • 对于某个表的读操作,不会阻塞其他用户对同一表的请求,但是会阻塞对同一表的写请求
    • 对于MyISAM的写操作,则会阻塞其他用户对统一表的读写请求
    • MyISAM表的读写操作之间,以及写操作之间是串行的
  • 当一个线程获取到一张表的写锁的时候,只有持有锁的线程会对表进行更新操作,其他线程读写操作都会等待,知道锁被释放为止。
  • MyISAM会自动加锁,不需要用户用lock table 命令显式的加锁

并发锁:在一定条件下,MyISAM也支持查询和操作的并发进行。

MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。

  • 当concurrent_insert设置为0时,不允许并发插入。
  • 当concurrent_insert设置为1时,如果MyISAM允许在一个读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
  • 当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾插入记录,都允许在表尾并发插入记录。

六、数据库索引有哪些?简单介绍一下每个索引是什么,怎么用?

普通索引:添加普通索引的列对数据没有特殊要求,普通索引能起到的作用就是加快查询效率 index

唯一性索引:在普通索引的基础上,要求添加该索引的列所有的值都只会出现一次。唯一性索引常用于添加在身份证号、学号等字段,不可以添加在名字等字段 unique

主键索引:是数据库所有索引种查询速度最快的,并且每个数据表只能有一个主键索引列。主键索引的列不允许出现重复的数据,也不允许为空值 primary

复合索引:如果想要创建一个包含不同列的索引,就可以创建复合索引。比如想要记录数据包的内容,就需要把IP地址和端口号作为标识包的依据,这时候可以把IP地址和端口号的列作为创建为复合索引。相当于创建了一个多列的主键索引,添加复合索引的任何一个列都不允许数据为空,并且不允许数据完全相同。

全文索引:主要是解决大数据量的情况下模糊查询的问题。如果数据库中的某个字段的数据量特别大,用like+通配符的方式查询会特别慢,所以我们可以使用全文索引的方式,来加快模糊查询的速度。原理是通过分词技术,分析文本中关键词出现的频率,并依次建立索引。

索引的使用原则:

索引是典型的以空间换时间的策略,

索引的添加在加快了查询速度的同时也减慢了插入、删除的速度,因为在插入和删除数据的时候需要进行额外的索引操作。

数据量不大的时候不需要添加索引。

如果一个表中的值需要频繁的插入和修改,就不适合创建索引,反之,如果一个表中的值需要频繁的进行查询、排序和分组的字段需要建立索引。

如果一个字段满足唯一性索引就不要建立普通索引

七、说一下ORM框架

orm:对象映射关系模式 是一种为了解决面向对象与关系型数据库存在互不匹配现象的技术。

ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件信息,把对象持久化到数据库中。ORM框架就是为了解决面向对象与关系型数据库存在不匹配的现象的框架。

当前有五种ORM框架:

Hibernate 全自动 需要自己写hql语句

iBatis 半自动 自己写sql语句,可操作性强,小巧

mybatis

eclipseLink

JFinal

为什么使用ORM框架:因为如果不使用,我们就会写特别多的数据访问层的代码,从数据库保存、删除、读取对象信息。而这些代码都是重复的,使用ORM就能减少大量的重复性代码。

优点:

提高开发效率,降低开发成本

使开发更加对象化

可移植

可以很方便的引入数据缓存之类的附加功能

缺点:

处理多表联查、where条件复杂之类的查询时,ORM语法会变得复杂。

八、ArrayList和LinkedList的区别,双向链表和单向链表相比有什么好处?

和双向链表的区别是双向链表比单向链表每个节点多一个头指针,这个指针指向前一个节点,也就是说,每个节点包含头指针、存储元素、尾指针,因此从这个节点可以同时访问它前面和后面的节点。

如果是单向链表,要访问同一个节点前面的节点,要从头节点开始遍历,直到找到这个节点前面的节点为止,而双向链表直接就可以访问前一个节点,查询和操作数据更加方便,是用空间换取时间的一种方式。

九、SpringBoot比SpringMVC好在哪里?

SpringMVC是基于Servlet的一个MVC框架,主要解决Web问题,使用简单、灵活性强、易扩展,但是配置复杂

首先要配置好Tomcat,配置端口文件、配置指向外部的war包文件,重启Tomcat的时候需要清理缓存

SpringMVC本身也有很多的xml文件需要配置,比如mvc部分、config部分

还有web.xml也要配置

Spring与MVC的Servlet API耦合,难以脱离容器独立运行

太过细化,开发效率低

SpringBoot的核心功能:

独立运行的Spring项目,可以以jar包的形式独立运行

内嵌的ServLet容器,能让项目快速运行

提供了starter简化maven配置

自动配置spring,简化了配置,特殊情况下也可以自定义自动配置

应用监控

十、SpringBoot如何配置多数据源

  • 继承AbstractRoutingDataSource
  • Mybatis插件 读写分离
  • AOP + 自定义注解 不同应用对应不同的数据库
  • 集成多个mybatis框架

十二、Mysql事务 隔离级别

事务的特性:原子性、一致性、隔离性、持久性

脏读 不可重复读 幻读

读未提交 ❌ ❌ ❌

读已提交 ✔ ❌ ❌

可重复读 ✔ ✔ ❌

串行化 ✔ ✔ ✔

隔离级别是如何实现的?

事务的隔离机制主要是依靠锁机制和MVCC(所版本并发控制)实现的,读已提交和可重复读可以通过MVCC实现,串行化可以通过锁机制实现。

什么是MVCC?

是一种并发控制的方法,主要来提高数据库的并发性能

首先要了解当前读和快照读

  • 当前读:读取的是数据库的最新版本,并且在读取的时候要保证其他事务不会修改当前记录,所以会对读取的记录加锁。
  • 快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗。

可以看到MVCC的作用就是在不加锁的情况下,解决数据库读写冲突问题,并且解决脏读、幻读、不可重复读等问题,但不能解决丢失修改等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M.Y.C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值