秋招面试补不足!!!

27 篇文章 0 订阅
5 篇文章 0 订阅

deque和queue区别

  • queue接口是单向队列,只能从队列的尾部添加元素,从头部弹出元素。
  • 而deque是双端队列,维护着头尾指针,既可以在队列的头尾添加元素,也可以在队列的头尾弹出元素。
  • queue通常不允许插入空值,因为空值一般用作队列为空的判断,不过LinkedList可以插入空值,但是最好不要插入空值。
  • LinkedList实现了deque接口,queue接口,List接口。

使用LinkedList的时候,如果使用队列的添加函数,默认从队列的尾部添加;使用栈的添加函数,默认在队列头添加;而peek查看元素是查看队列头。
对于栈来说,队列的头部就是栈顶。

sql执行时,底层发送了什么?

  • 首先连接器建立到数据库的连接。
  • 查询缓存,如果select语句查询的数据在缓存里,就直接返回。如果没有就执行后续操作,查询完成之后再写入缓存。(一旦遇到经常更新的,缓存就会经常被清空;8.0开始没有该功能)
  • 如果没有命中缓存,mysql就开始执行sql语句,首先分析器会对sql语句进行解析。首先词法分析,分析哪些词代表哪些意思。接着做语法分析,分析该sql语句是否符合语法规范。不符合规范就会报错,提示语法错误的地方。
  • 经过了分析器之后,mysql知道了sql语句所要执行的操作。但是开始执行之前,会先进行优化器优化,比如多个索引的时候,选择走哪个索引;多个表连接的时候先连接哪两个表。
  • 接着到了执行器阶段。执行之前,会先判断用户对当前表是否有该操作的权限,没有权限就会报错。如果有权限,就打开表继续执行。打开表的时候,优化器就会根据表的引擎定义,去使用这个引擎提供的接口。
    例如查询name=‘lisi’,如果没有索引会一条一条地查询记录,如果记录对应,就将记录放入结果集,一直查询完整个表,然后返回结果集。如果有索引就会去查询索引,如果索引能直接命中需要的字段就返回结果集,否则就执行回表操作,回到主表进行查询,并返回结果集。至此sql语句执行完毕。

如何保证mysql原子性

靠undolog日志文件,执行事务的时候会将执行的写指令写入undolog日志文件,如果发生回滚,就将undolog的sql执行就可以恢复到事务前的状态。

如何保证mysql一致性

  • 数据库通过原子性(A)、隔离性(I)、持久性(D)来保证一致性(C)。其中一致性是目的,原子性、隔离性、持久性是手段。因此数据库必须实现AID三大特性才有可能实现一致性。
  • mysql事务提交的时候有两个阶段。第一个阶段是将提交的事务操作写入redolog日志文件,并且redolog日志文件变为prepare状态。第二阶段将操作写入binlog日志文件,修改状态为commit,然后提交事务。
  • 如果在第二阶段之前发生宕机,事务就会回滚。此时还没有写binlog,也就不会导致主从数据不一致。
  • 如果在第二阶段执行过程中发生宕机,mysql会根据redolog里面的事务做判断,如果事务已经完整,有了commit标识,那么就提交事务。如果redolog还是处于prepare状态,就判断binlog日志里面对应的事务是否存在并且完整,是就提交事务;否就回滚。
  • 为什么需要两个阶段呢?是为了保证数据的一致性。在多库的情况下,如果事务提交过程中发生宕机,可能会导致主库和从库的数据不一致。

如何保证mysql持久性

mysql有一个redolog日志,是用来保证事务安全的。每次有写操作的时候都会先记录到redolog日志文件中,等到CPU不忙的时候再持久化到磁盘。如果持久化之前数据库宕机了,重启之后会执行redolog里面的sql指令,完成数据持久化。
Binlog是用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复。

binlog和redolog的区别

  • binlog是mysql server层实现的二进制日志,而redolog是引擎层的重做日志。
  • binlog记录的是逻辑日志,记录的是具体的写操作sql语句;而redolog记录的是物理日志,记录的是哪个物理页发生了什么改变。
  • binlog在使用完一页之后,会生成新的页,然后再新的页上面写;而redolog会用新的记录去覆盖旧的记录。
  • binlog可以作为恢复数据使用,主从复制搭建;而redo log作为异常宕机或者介质故障后的数据恢复使用。

说说AQS

  • AQS就是一个并发包的基础组件,用来实现各种锁,各种同步组件的。它包含了state变量、加锁线程、同步队列、等待队列等并发中的核心组件。
  • 同步组件进行加锁是通过修改state的值来达到的,一开始没锁的时候state的值为0.线程使用CAS操作修改state的值为1.修改成功,就设置当前加锁线程为自己,重入的时候会查看当前加锁的线程是否是自己,是的话就可重入,state的值加一。每当释放一把锁,state的值就减一。
  • 其他线程到达的时候,如果尝试CAS修改失败,并且当前加锁线程非自己,就调用addWaiter方法将当前线程封装成节点,加入到同步队列。
  • 如果获得锁的线程需要等待某个条件,就将该线程放入条件队列。条件队列可以有多个。当条件满足时,线程会从等待队列重新进入同步队列进行获取锁的竞争。(例如调用conditon.await,遇到condition.signal就将线程放到同步队列,不过线程并未被唤醒,当线程处于同步队列的头节点的时候才会被唤醒)

SpringBoot和SSM有什么区别,如何实现的?

SpringBoot动态装配如何实现?

synchronized底层如何实现加锁?

synchronized和Lock的区别

synchronized是Java语法的一个关键字,加锁的过程是在JVM底层进行。Lock是一个类,是JDK应用层面的,在JUC包里有丰富的API。
synchronized在加锁和解锁操作上都是自动完成的,Lock锁需要我们手动加锁和解锁。
Lock锁有丰富的API能知道线程是否获取锁成功,而synchronized不能。
synchronized能修饰方法和代码块,Lock锁只能锁住代码块。
Lock锁有丰富的API,可根据不同的场景,在使用上更加灵活。
synchronized是非公平锁,而Lock锁既有非公平锁也有公平锁,可以由开发者通过参数控制。

如何解决分布式主键id

设置步长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值