一些八股总结
-
1.为什么Java对每一个基本数据类型都提供了包装类?
- 因为java是面向对象的语言,将基本类型转成包装类可以使用对象特有的一些特性,想对象的一些函数等,还有就是java里面的泛型只能使用对象。
-
2.为什么浮点数是不精准的?说说具体原因
- 因为计算机是用二进制来进行存储和运算的,但是一些十进制的小数二进制是无法进行表示的就像十进制的0.1其二进制是0.0001100110011…一个无限循环的小数。
-
3.java的三大特性
- 继承、封装、多态
-
4.具体讲一下
- 继承:一个类可以继承另一个类的属性和方法,并且可以对其进行新增和修改类实现自己的特性,达到复用的效果。
- 封装:将对象的属性和方法进行封装,对外屏蔽其实现的内部细节,之对外提供一个公开的调用接口。
- 多态:一个类在不同的对象表现出不同的行为,其实现方式有三种:1.继承然后重写父类方法。2.实现接口并实现接口的方法。3.重载。
-
5.聊聊 AIO、BIO 和 NIO?
- AIO:异步非阻塞IO。I/O 操作完全由操作系统完成,线程发起 I/O 请求后立即返回,无需等待(不阻塞),当操作完成后,操作系统通过回调通知应用程序。通过 CompletionHandler 处理 I/O 完成事件,无需主动轮询。
- BIO:同步阻塞IO。I/O 操作(如读 / 写)会阻塞线程,直到操作完成。每个客户端连接对应一个处理线程,线程在 I/O 操作期间会被完全占用,无法处理其他任务。
- NIO:同步非阻塞IO:I/O 操作不会阻塞线程,线程可在等待 I/O 就绪时处理其他任务。其利用多路复用来实现。
-
6.HashMap 在 get 和 put 时经过哪些步骤?
-
7.ConcurrentHashMap 是如何保证线程安全的?分段锁机制又是什么?后面为什么又要废除?
-
8.如何保证并发安全?并发安全的三要素是什么?
- 三要素:原子性、可见性、有序性
- 保证并发安全:1、加锁synchronized、ReentrantLock等。2.使用版本号控制等实现乐观锁。3、使用volatile加锁,但是只适用于非复合操作,因为不能防止指令重排。
-
9.synchronized 是如何保证原子性、可见性、有序性的?
- 原子性:通过进入(monitorenter)和退出(monitorexit)字节码指令来实现的。每个对象都与一个监视器(monitor)关联。线程执行 monitorenter 指令尝试获取对象的监视器所有权,获取成功则锁计数器+1。执行 monitorexit 指令则锁计数器-1,计数器为0时锁被释放。
- 可见性:当线程释放锁时(退出 synchronized 块),JVM 会强制将该线程的工作内存中所有对共享变量的修改立即刷新到主内存中。当线程获取锁时(进入 synchronized 块),JVM 会使该线程的本地工作内存中所有关于该锁保护的共享变量的缓存无效,从而必须从主内存重新读取最新值。实现原理:会在临界区(同步块)的入口和出口插入内存屏障(Memory Barrier),这些屏障阻止了处理器对内存操作进行重排序,并强制刷新CPU缓存。
- 有序性:as-if-serial 语义在同步块内的扩展 + 禁止重排序。单个线程内的指令重排还是存在的。
-
10.什么是数据库事务机制?
- 个人理解:数据库事务主要有四个特性A(原子性)C(一致性)I(隔离性)D(持久性),要保证数据库事务就必须满足这四个条件。
- 原子性:原子性就是在一个事务里面的所有操作要么全部成功要么全部失败。实现原理:所有undolog来实现事务的回滚操作。
- 一致性:事务执行必须使数据库状态从一个一致性状态转为另一个一致性状态,原子性、隔离性、持久性是保证最终的一致性条件。
- 隔离性:不同事务在同一时间的操作是相互隔离的互不影响。实现原理:MySQL里面依靠的是MVCC来实现事务隔离的。
- 持久性:对事务已提交的修改进行持久化。实现原理:依靠redolog来实现,如果在事务提交后服务挂掉或者其他问题导致数据丢失,可以使用redolog快速恢复。
- 个人理解:数据库事务主要有四个特性A(原子性)C(一致性)I(隔离性)D(持久性),要保证数据库事务就必须满足这四个条件。
-
11.MySQL中的事务隔离级别?
- 1.读未提交,可以读取其他事务还没提交的数据。可能出现脏读,幻读,不可重复的。
- 2.读已提交,事务只能读取其他事务已经提交后的数据,解决了脏读的问题。
- 3.可重复读,MySQL默认的隔离级别也是RR(可重复读),通过MVCC来实现的。
- 4.可串行化,事务之间通过串行的形式来执行的,解决了脏读,幻读,不可重复读。
-
12.为什么MySQL默认使用RR隔离级别?
- 由于MySQL在5.1.5版本之前binlog存的数据格式是statement(直接存的是数据更新的SQL语句)这样的话使用RC的隔离级别可能导致主从复制的时候出现数据不一致的问题。
- 在RC隔离级别下,组数据库执行这两个事务的结果是先删除b<100的数据然后添加(10,99),所以当这两个事务执行完后b<100的数据里面有一条(10,99),但是在binlog里面存的SQL语句是先insert后delete,所以在从节点里面的数据b<100是没有数据的,造成主从节点数据的不一致。
- 在RR的隔离级别下,两个事务先执行delete操作会对b<100的这些数据加临间锁,在事务1提交之前,事务2的insert操作是会被阻塞的。这样都是先删除后插入。
-
13.为什么默认RR,大厂要改成RC?
- 因为RC级别只会对操作的数据加行锁并且支持半一致读,而在RR级别会加临间锁锁的粒度比较大阻塞的可能性更大,大厂使用RC可以提高并发。
-
14.innodb的RR到底有没有解决幻读?
-
15.什么是脏读、幻读、不可重复读?
-
16.InnoDB如何解决脏读、不可重复读和幻读的?
-
17.MySQL如何实现不同隔离级别?
-
18.InnoDB的一次更新事务过程是怎么样的?
-
19.binlog、redolog和undolog区别?
-
20.一次insert操作,MySQL的几种log的写入顺序?
-
21.MySQL执行大事务会存在什么问题?
-
22.什么是事务的2阶段提交?
-
23.二级索引在索引覆盖时如何使用MVCC?
-
24.如何理解MVCC?
-
25.能详细说一下MVCC机制的执行原理吗?
-
26.MVCC是怎么实现的?
-
27.介绍下InnoDB的锁机制?
-
28.MySQL的行级锁锁的到底是什么?
-
29.InnoDB中的表级锁、页级锁、行级锁?
-
30.什么是排他锁和共享锁?
-
31.什么是意向锁?
-
32.怎么使用MySql实现一个乐观锁?
-
33.乐观锁和悲观锁的区别是什么?
-
34.MySQL只操作同一条记录,也会发生死锁吗?
-
35.能说一下MySql的索引吗?
-
36.MySQL是如何保证唯一性索引的唯一性的?
-
37.什么是聚簇索引和非聚簇索引?
-
38.唯一索引和主键索引的区别?
-
40.什么是前缀索引,使用的时候要注意什么?
-
41.从 innodb的索引结构分析,为什么索引的key使用B+树?
-
42.如果公司要使用针对文字进行查询,应该怎么提升效率?
-
43.怎么使用MySql实现一个分布式锁?
-
44.什么是最左前缀匹配?为什么要遵守?
-
45.MySQL索引一定遵循最左前缀匹配吗?
-
46.唯一索引应该使用UUID还是自增主键?
-
47.InnoDB和MyISAM有什么区别?
-
48.聊聊你对MySql日志机制的理解。
-
49.日志机制的实现原理是什么?