Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ head:

破坏第一个条件 **互斥条件**:使得资源是可以同时访问的,这是种简单的方法,磁盘就可以用这种方法管理,但是我们要知道,有很多资源 **往往是不能同时访问的** ,所以这种做法在大多数的场合是行不通的。

破坏第三个条件 **非抢占** :也就是说可以采用 **剥夺式调度算法**,但剥夺式调度方法目前一般仅适用于 **主存资源** 和 **处理器资源** 的分配,并不适用于所以的资源,会导致 **资源利用率下降**。
破坏第三个条件 **非抢占** :也就是说可以采用 **剥夺式调度算法**,但剥夺式调度方法目前一般仅适用于 **主存资源** 和 **处理器资源** 的分配,并不适用于所有的资源,会导致 **资源利用率下降**。

所以一般比较实用的 **预防死锁的方法**,是通过考虑破坏第二个条件和第四个条件。

Expand Down
4 changes: 2 additions & 2 deletions docs/system-design/basis/refactoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ category: 代码质量

项目团队的每一个人只有保证自己的提交没有让项目代码变得更腐化,项目代码才会朝着健康的方向发展。

**当我们离开营地(项目代码)的时候,请不要留下垃圾(代码花味道)!尽量确保营地变得更干净了!**
**当我们离开营地(项目代码)的时候,请不要留下垃圾(代码坏味道)!尽量确保营地变得更干净了!**

### 开发一个新功能之后&之前

Expand Down Expand Up @@ -139,4 +139,4 @@ Code Review 可以非常有效提高代码的整体质量,它会帮助我们
## 参考

- [再读《重构》- ThoughtWorks 洞见 - 2020](https://insights.thoughtworks.cn/reread-refactoring/) :详细介绍了重构的要点比如小步重构、捡垃圾式的重构,主要是重构概念相关的介绍。
- [常见代码重构技巧 - VectorJin - 2021](https://juejin.cn/post/6954378167947624484) :从软件设计原则、设计模式、代码分层、命名规范等角度介绍了如何进行重构,比较偏实战。
- [常见代码重构技巧 - VectorJin - 2021](https://juejin.cn/post/6954378167947624484) :从软件设计原则、设计模式、代码分层、命名规范等角度介绍了如何进行重构,比较偏实战。
6 changes: 3 additions & 3 deletions docs/system-design/basis/unit-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ category: 代码质量

每个开发者都会经历重构,重构后把代码改坏了的情况并不少见,很可能你只是修改了一个很简单的方法就导致系统出现了一个比较严重的错误。

如果有了单元测试的话,就不会存在这个隐患了。写完一个类,把单元测试写了,确保这个类逻辑正确;写第二个类,单元测试.....写 100 个类,道理一样,每个类做到第一点“保证逻辑正确性”,100 个类拼在一起肯定不出问题。你大可以放心一边重构,一边运行 APP;而不是整体重构完,提心跳胆地 run。
如果有了单元测试的话,就不会存在这个隐患了。写完一个类,把单元测试写了,确保这个类逻辑正确;写第二个类,单元测试.....写 100 个类,道理一样,每个类做到第一点“保证逻辑正确性”,100 个类拼在一起肯定不出问题。你大可以放心一边重构,一边运行 APP;而不是整体重构完,提心吊胆地 run。

### 提高代码质量

Expand Down Expand Up @@ -67,7 +67,7 @@ category: 代码质量

### 心虚

笔者也是个不太相信自己代码的人,总觉得哪里会突然冒出莫名其妙的 bug,也怕别人不小心改了自己的代码(被害妄想症),新版本上线提心跳胆......花点时间写单元测试,有事没事跑一下测试,确保原逻辑没问题,至少能睡安稳一点。
笔者也是个不太相信自己代码的人,总觉得哪里会突然冒出莫名其妙的 bug,也怕别人不小心改了自己的代码(被害妄想症),新版本上线提心吊胆......花点时间写单元测试,有事没事跑一下测试,确保原逻辑没问题,至少能睡安稳一点。

## TDD 测试驱动开发

Expand Down Expand Up @@ -119,4 +119,4 @@ TDD 在很多人眼中是不实用的,一来他们并不理解测试“驱动

作为一名经验丰富的程序员,写单元测试更多的是**对自己的代码负责**。有测试用例的代码,别人更容易看懂,以后别人接手你的代码时,也可能放心做改动。

**多敲代码实践,多跟有单元测试经验的工程师交流**,你会发现写单元测试获得的收益会更多。
**多敲代码实践,多跟有单元测试经验的工程师交流**,你会发现写单元测试获得的收益会更多。
2 changes: 1 addition & 1 deletion docs/system-design/framework/spring/spring-transaction.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public class OrdersService {

这里再多提一下一个非常重要的知识点: **MySQL 怎么保证原子性的?**

我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行**回滚**,在 MySQL 中,恢复机制是通过 **回滚日志(undo log)** 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 **回滚日志** 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务
我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行**回滚**,在 MySQL 中,恢复机制是通过 **回滚日志(undo log)** 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 **回滚日志** 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚之前未完成的事务

### Spring 支持两种方式的事务管理

Expand Down