Java八股文(二)

72 阅读7分钟

操作系统

操作系统(三)

截屏2024-06-17 10.42.05.png

  1. 死锁的基本理论 截屏2024-06-17 11.10.33.png
  • 死锁的产生:竞争资源、进程的调度顺序不当 截屏2024-06-17 11.15.56.png

等待请求的资源被释放;自身占用的资源又不释放 截屏2024-06-17 11.17.44.png

死锁的四个必要条件:互斥条件、请求保持条件、不可剥夺条件、环路等待条件 截屏2024-06-17 11.21.00.png

截屏2024-06-17 11.21.23.png

截屏2024-06-17 11.21.54.png

截屏2024-06-17 11.22.44.png

预防死锁的方法: 截屏2024-06-17 11.24.49.png 截屏2024-06-17 11.25.31.png 截屏2024-06-17 11.27.07.png 截屏2024-06-17 11.27.45.png

解决死锁的算法: 截屏2024-06-17 11.29.10.png

  1. 线程-进程同步
  • 同步问题三大经典案例 截屏2024-06-17 11.33.08.png 截屏2024-06-17 11.34.48.png

不同进程之间的读写操作(蓝色一个进程、红色一个进程) 截屏2024-06-17 17.15.08.png 截屏2024-06-17 17.08.28.png

截屏2024-06-17 17.09.48.png 截屏2024-06-17 17.10.58.png

截屏2024-06-17 17.11.58.png 截屏2024-06-17 17.12.56.png

  1. 乐观锁、悲观锁、可重入锁
  • 乐观锁-悲观锁 (都是关于线程同步)
  • 悲观锁会给临界资源加锁;乐观锁不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据 截屏2024-06-17 17.32.57.png 截屏2024-06-17 17.44.27.png

截屏2024-06-17 17.46.41.png 自旋 不会放弃CPU


截屏2024-06-18 09.08.03.png 截屏2024-06-18 09.08.34.png

截屏2024-06-18 09.22.00.png 截屏2024-06-18 09.22.30.png

截屏2024-06-18 09.22.54.png 写线程只能获取排他锁;


  1. 互斥锁与自旋锁的区别——线程间通信
  • 互斥锁、读写锁、自旋锁、条件变量 截屏2024-06-18 09.35.22.png 截屏2024-06-18 09.38.13.png
  • 自旋锁 (自旋锁的实现原理与互斥锁实现原理不同) 截屏2024-06-18 09.40.21.png 截屏2024-06-18 09.43.06.png
  • 读写锁(适合临界资源 多读少写的情况) 截屏2024-06-18 09.45.26.png
  • 条件变量 截屏2024-06-18 09.46.17.png 截屏2024-06-18 09.46.51.png
  1. 进程间有哪些同步的方式——进程间通信 截屏2024-06-18 09.51.59.png
  • 进程间通信的方法(管道、消息队列、共享内存、信号、套接字)
  • 管道(匿名管道和命名管道) 截屏2024-06-18 09.55.46.png
  • 消息队列(生产者消费者属于不同进程,相比管道消息队列可以对数据继续序列化)
  • 消息队列可以 单机进程间通信,跨机进程间通信(kafka、rabbitMQ) 截屏2024-06-18 09.58.44.png
  • 共享内存 截屏2024-06-18 10.07.50.png
  • 信号(仅仅起一个通知的作用,进程之间没有数据交流) 截屏2024-06-18 10.08.54.png 截屏2024-06-18 10.09.48.png
  • 网络套接字
  • 网络套接字 可以单机进程间,也可以跨机进程间(eg传输层 通过IP地址+端口 形成套接字) 截屏2024-06-18 10.12.11.png 截屏2024-06-18 10.14.18.png

总结:仅消息队列、套接字 可以跨机间进程通信

  1. 无锁数据结构的原理——CAS原理与无锁技术 截屏2024-06-18 10.18.04.png
  • 无锁技术的基石是CAS技术 截屏2024-06-18 10.20.21.png 截屏2024-06-18 10.24.54.png 截屏2024-06-18 10.26.49.png (通过给旧值版本号的概念,避免CAS与ABA问题)
  1. 分布式锁的实现方式 截屏2024-06-18 10.29.58.png 截屏2024-06-18 10.36.56.png 截屏2024-06-18 10.38.21.png
  • 常见分布式锁的实现方法(三种:redis、zookeeper、基于MySQL) 截屏2024-06-19 08.48.45.png 截屏2024-06-19 08.51.36.png Redis单节点 通过k-v键值对的方式 实现分布式锁

截屏2024-06-19 08.53.13.png 截屏2024-06-19 08.54.45.png

截屏2024-06-19 08.57.31.png

截屏2024-06-19 08.59.06.png

数据库

数据库(一)

  1. 关系数据库与其他数据库
  • 关系数据库: 把复杂的数据结构归结为简单的二元关系 截屏2024-06-19 09.07.40.png
  • 非关系数据库(k-v、文档、列存储数据库、图数据库) 截屏2024-06-19 09.11.46.png 截屏2024-06-19 09.12.44.png
  1. 数据库的设计、创建与维护
  • 现在版本的数据库 DataBase和Schema(模式) 两者同义 create database xxx;
  • CHARACTER SET = utf8mb4
  1. 数据表的设计、创建与维护
  • 主键 外键 索引
PRIMARY KEY (FCourseld),
FOREIGN KEY(FTeacherld) REFERENCES teacher(Fld)
KEY(列名)
  • table options
  • partition options
  1. char、varchar和text有什么区别——表字段属性 截屏2024-06-19 09.43.54.png
  • 数字类型 截屏2024-06-19 09.45.14.png 截屏2024-06-19 09.47.26.png
  • 日期类型 截屏2024-06-19 09.48.31.png
  • 字符串类型 截屏2024-06-19 09.49.34.png 截屏2024-06-19 09.51.19.png
  • JSON类型 截屏2024-06-19 09.54.47.png
  1. 数据库的ACID属性 截屏2024-06-19 10.09.25.png
  • ACID 原子性、一致性、隔离性、持久性 截屏2024-06-19 10.10.12.png 截屏2024-06-19 10.12.01.png 截屏2024-06-19 10.14.14.png 截屏2024-06-19 10.15.06.png
  1. 脏读、幻不可重复读、幻读的概念 与 隔离性
  • 隔离级别:未提交读、提交读、可重复读、串行化 截屏2024-06-19 10.22.30.png

注意:我们讨论隔离级别的场景,主要是在多个事务并发的情况下,因此,接下来的讲解都围绕事务并发。 

  • Read uncommitted 读未提交
  1. 公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有2000元,singo空欢喜一场。
  2. 出现上述情况,即我们所说的脏读,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。
  3. 当隔离级别设置为Read uncommitted时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。
  • Read committed 读提交
  1. singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为何......
  2. 出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
  3. 当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。
  4. 大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。
  • Repeatable read 重复读
  1. 当隔离级别设置为Repeatable read时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。
  2. 虽然Repeatable read避免了不可重复读,但还有可能出现幻读。
  3. singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出现了幻觉,幻读就这样产生了。

注:MySQL的默认隔离级别就是Repeatable read。

  • Serializable 序列化(串行读)

Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

数据库(二)

  1. MySQL索引 截屏2024-06-19 10.45.59.png
  • 索引数据结构 对比 截屏2024-06-19 10.50.42.png 截屏2024-06-19 10.53.50.png

改进:二叉树可以通过仅在叶子节点保存数据,叶子节点使用双向链表的方法,实现快速范围查询

二叉树 树高问题 ---> B+树 截屏2024-06-19 10.56.10.png 截屏2024-06-19 10.56.48.png

  1. 聚簇索引——聚簇索引与非聚簇索 截屏2024-06-19 11.02.15.png 截屏2024-06-19 11.04.28.png 截屏2024-06-19 11.09.26.png
  • 聚簇索引 截屏2024-06-19 11.12.11.png
  • 非聚簇索引 截屏2024-06-19 11.15.17.png

总结:

  • 一个数据表只有一个聚簇索引
  • 一个数据表可以有多个非聚簇索引
  • 非聚餐索引被称为二级索引: 截屏2024-06-19 11.22.32.png
  • 聚簇索引优点: 截屏2024-06-19 11.23.32.png 截屏2024-06-19 11.24.21.png
  1. 联合索引(多个字段组成) 截屏2024-06-19 11.27.37.png 截屏2024-06-19 17.17.11.png 截屏2024-06-19 17.26.39.png
  • 五个具体案例
  • 1️⃣ 使用联合索引
  • 2️⃣ 使用联合索引
  • 3️⃣ 使用联合索引找f_x 但是找f_z时不使用联合索引
  • 4️⃣ 不使用联合索引,因为没有联合索引第一个字段
  • 5️⃣ 使用联合索引
  1. MVCC的原理 截屏2024-06-19 17.39.15.png
  • MVCC实现的关键是 三个隐藏列 截屏2024-06-19 17.40.32.png 截屏2024-06-19 19.53.18.png 截屏2024-06-19 19.56.11.png 截屏2024-06-19 19.57.40.png 截屏2024-06-19 20.00.56.png 截屏2024-06-19 20.01.57.png
  1. MySQL常见的日志类型——数据库备份与恢复
  • 二进制日志、重做日志、回滚日志、慢查询日志、中继日志
  • 重做日志 为了事务提交一定会完成所设置
  • 回滚日志 为了方便事务回滚所设置 截屏2024-06-19 20.18.07.png
  1. MySQL权限维护
  • 权限粒度:全局层级、数据库层级、数据库对象层级、列层级 截屏2024-06-19 20.24.41.png

程序设计之面向对象编程

  1. 面向对象开发的核心思想和概念 截屏2024-06-19 20.33.53.png 截屏2024-06-19 20.51.34.png 截屏2024-06-19 20.53.02.png 截屏2024-06-19 20.54.11.png 截屏2024-06-19 20.55.58.png 截屏2024-06-19 20.56.40.png 截屏2024-06-19 20.57.23.png

  2. 接口的基本设计

  • 接口是系统对外提供的所有服务的抽象,类的所有能够被外部使用者访问的方法构成一个类的接口。 截屏2024-06-19 21.01.45.png 截屏2024-06-19 21.03.02.png

截屏2024-06-19 21.04.02.png 截屏2024-06-19 21.04.45.png 截屏2024-06-19 21.05.45.png

  1. 类的实现与继承
  • 方法重载 和 方法覆盖(重写) 截屏2024-06-19 21.11.16.png 截屏2024-06-19 21.12.22.png
  1. 继承的使用原则 截屏2024-06-19 21.14.18.png
  • 继承树的最上层应该为抽象层

截屏2024-06-19 21.17.08.png