Skip to content

Commit a0d1eef

Browse files
committed
Merge branch 'main' of github.com:Mzmba/JavaGuide
2 parents e3160f8 + 35417ec commit a0d1eef

File tree

19 files changed

+601
-272
lines changed

19 files changed

+601
-272
lines changed

README.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,12 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
122122
- [Java 10 新特性概览](./docs/java/new-features/java10.md)
123123
- [Java 11 新特性概览](./docs/java/new-features/java11.md)
124124
- [Java 12~13 新特性概览](./docs/java/new-features/java12-13.md)
125-
- [Java 14~15 新特性概览](./docs/java/new-features/java14-15.md)
125+
- [Java 14 新特性概览](./docs/java/new-features/java14.md)
126+
- [Java 15 新特性概览](./docs/java/new-features/java15.md)
126127
- [Java 16 新特性概览](./docs/java/new-features/java16.md)
127128
- [Java 18 新特性概览](./docs/java/new-features/java18.md)
128129
- [Java 19 新特性概览](./docs/java/new-features/java19.md)
129130

130-
![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png)
131-
132131
## 计算机基础
133132

134133
### 操作系统
@@ -343,8 +342,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
343342
- [ZooKeeper 相关概念总结(进阶)](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md)
344343
- [ZooKeeper 实战](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md)
345344

346-
![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png)
347-
348345
## 高性能
349346

350347
### 消息队列

docs/.vuepress/sidebar.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,10 @@ export const sidebarConfig = defineSidebarConfig({
145145
"java10",
146146
"java11",
147147
"java12-13",
148-
"java14-15",
148+
"java14",
149+
"java15",
149150
"java16",
151+
"java17",
150152
"java18",
151153
"java19",
152154
],

docs/books/database.md

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,46 @@ head:
1010

1111
## 数据库基础
1212

13-
**[《数据库系统概念](https://book.douban.com/subject/10548379/)**
13+
数据库基础这块,如果你觉得书籍比较枯燥,自己坚持不下来的话,我推荐你可以先看看一些不错的视频,北京师范大学的[《数据库系统原理](https://www.icourse163.org/course/BNU-1002842007)、哈尔滨工业大学的[《数据库系统(下):管理与技术》](https://www.icourse163.org/course/HIT-1001578001)就很不错。
1414

15-
这本书涵盖了数据库系统的全套概念,知识体系清晰,是学习数据库系统非常经典的教材!不是参考书!
15+
[《数据库系统原理》](https://www.icourse163.org/course/BNU-1002842007)这个课程的老师讲的非常详细,而且每一小节的作业设计的也与所讲知识很贴合,后面还有很多配套实验。
1616

17-
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/booksimage-20220409150441742.png)
18-
19-
如果你觉得书籍比较枯燥,自己坚持不下来的话,我推荐你可以先看看一些不错的视频。就比如北京师范大学的[《数据库系统原理》](https://www.icourse163.org/course/BNU-1002842007)这个就很不错。
17+
![](https://img-blog.csdnimg.cn/20210406154403673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
2018

21-
这个课程的老师讲的非常详细,而且每一小节的作业设计的也与所讲知识很贴合,后面还有很多配套实验。
2219

23-
![](https://img-blog.csdnimg.cn/20210406154403673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
2420

25-
如果你比较喜欢动手,对于理论知识比较抵触的话,我推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。
21+
如果你比较喜欢动手,对于理论知识比较抵触的话,推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。
2622

2723
![](https://img-blog.csdnimg.cn/20210406154601698.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70)
2824

25+
Github上也已经有大佬用 Java 实现过一个简易的数据库,介绍的挺详细的,感兴趣的朋友可以去看看。地址:[https://github.com/alchemystar/Freedom](https://github.com/alchemystar/Freedom)
26+
27+
除了这个用 Java 写的之外,**[db_tutorial](https://github.com/cstack/db_tutorial)** 这个项目是国外的一个大佬用 C 语言写的,朋友们也可以去瞅瞅。
28+
29+
**只要利用好搜索引擎,你可以找到各种语言实现的数据库玩具。**
30+
31+
![](https://oscimg.oschina.net/oscnet/up-d32d853f847633ac7ed0efdecf56be1f1d2.png)
32+
2933
**纸上学来终觉浅 绝知此事要躬行!强烈推荐 CS 专业的小伙伴一定要多多实践!!!**
3034

35+
### 《数据库系统概念》
36+
37+
[《数据库系统概念》](https://book.douban.com/subject/10548379/)这本书涵盖了数据库系统的全套概念,知识体系清晰,是学习数据库系统非常经典的教材!不是参考书!
38+
39+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/booksimage-20220409150441742.png)
40+
41+
### 《数据库系统实现》
42+
43+
如果你也想要研究 MySQL 底层原理的话,我推荐你可以先阅读一下[《数据库系统实现》](https://book.douban.com/subject/4838430/)
44+
45+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books/database-system-implementation.png)
46+
47+
不管是 MySQL 还是Oracle ,它们总体的架子是差不多的,不同的是其内部的实现比如数据库索引的数据结构、存储引擎的实现方式等等。
48+
49+
这本书有些地方还是翻译的比较蹩脚,有能力看英文版的还是建议上手英文版。
50+
51+
《数据库系统实现》 这本书是斯坦福的教材,另外还有一本[《数据库系统基础教程》](https://book.douban.com/subject/3923575/)是前置课程,可以带你入门数据库。
52+
3153
## MySQL
3254

3355
我们网站或者 APP 的数据都是需要使用数据库来存储数据的。
@@ -56,24 +78,26 @@ head:
5678

5779
如果你还在纠结是否尝试一下 PostgreSQL 的话,建议你看看这个知乎话题:[PostgreSQL 与 MySQL 相比,优势何在? - 知乎](https://www.zhihu.com/question/20010554)
5880

59-
**[《PostgreSQL 指南:内幕探索》](https://book.douban.com/subject/33477094/)**
60-
61-
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books/PostgreSQL-Guide.png)
81+
### 《PostgreSQL 指南:内幕探索》
6282

63-
这本书主要介绍了 PostgreSQL 内部的工作原理,包括数据库对象的逻辑组织与物理实现,进程与内存的架构。
83+
[《PostgreSQL 指南:内幕探索》](https://book.douban.com/subject/33477094/)这本书主要介绍了 PostgreSQL 内部的工作原理,包括数据库对象的逻辑组织与物理实现,进程与内存的架构。
6484

6585
刚工作那会需要用到 PostgreSQL ,看了大概 1/3 的内容,感觉还不错。
6686

67-
**[《PostgreSQL 技术内幕:查询优化深度探索》](https://book.douban.com/subject/30256561/)**
87+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books/PostgreSQL-Guide.png)
6888

69-
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books/PostgreSQL-TechnologyInsider.png)
89+
### PostgreSQL 技术内幕:查询优化深度探索》
7090

71-
这本书主要讲了 PostgreSQL 在查询优化上的一些技术实现细节,可以让你对 PostgreSQL 的查询优化器有深层次的了解。
91+
[《PostgreSQL 技术内幕:查询优化深度探索》](https://book.douban.com/subject/30256561/)这本书主要讲了 PostgreSQL 在查询优化上的一些技术实现细节,可以让你对 PostgreSQL 的查询优化器有深层次的了解。
92+
93+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books/PostgreSQL-TechnologyInsider.png)
7294

7395
## Redis
7496

7597
**Redis 就是一个使用 C 语言开发的数据库**,不过与传统数据库不同的是 **Redis 的数据是存在内存中的** ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
7698

77-
如果你要学习 Redis 的话,强烈推荐 **[《Redis 设计与实现》](https://book.douban.com/subject/25900156/)****[《Redis 实战》](https://book.douban.com/subject/26612779/)** 这两本书。另外,**[《Redis 开发与运维》](https://book.douban.com/subject/26971561/)** 这本书也非常不错,既有基础介绍,又有一线开发运维经验分享。
99+
如果你要学习 Redis 的话,强烈推荐 **[《Redis 设计与实现》](https://book.douban.com/subject/25900156/)****[《Redis 实战》](https://book.douban.com/subject/26612779/)** 这两本书。
100+
101+
另外,**[《Redis 开发与运维》](https://book.douban.com/subject/26971561/)** 这本书也非常不错,既有基础介绍,又有一线开发运维经验分享。
78102

79103
![](https://oscimg.oschina.net/oscnet/up-9f20f5e860d143181bd27343abfef3af2ce.png)

docs/database/redis/redis-questions-02.md

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,48 +21,101 @@ Redis 可以通过 **`MULTI`,`EXEC`,`DISCARD` 和 `WATCH`** 等命令来实
2121
```bash
2222
> MULTI
2323
OK
24-
> SET USER "Guide哥"
24+
> SET PROJECT "JavaGuide"
2525
QUEUED
26-
> GET USER
26+
> GET PROJECT
2727
QUEUED
2828
> EXEC
2929
1) OK
30-
2) "Guide哥"
30+
2) "JavaGuide"
3131
```
3232

33-
使用 [`MULTI`](https://redis.io/commands/multi) 命令后可以输入多个命令Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [`EXEC`](https://redis.io/commands/exec) 命令将执行所有命令
33+
[`MULTI`](https://redis.io/commands/multi) 命令后可以输入多个命令Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [`EXEC`](https://redis.io/commands/exec) 命令后,再执行所有的命令
3434

3535
这个过程是这样的:
3636

37-
1. 开始事务(`MULTI`
38-
2. 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行)
37+
1. 开始事务(`MULTI`
38+
2. 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行)
3939
3. 执行事务(`EXEC`)。
4040

4141
你也可以通过 [`DISCARD`](https://redis.io/commands/discard) 命令取消一个事务,它会清空事务队列中保存的所有命令。
4242

4343
```bash
4444
> MULTI
4545
OK
46-
> SET USER "Guide哥"
46+
> SET PROJECT "JavaGuide"
4747
QUEUED
48-
> GET USER
48+
> GET PROJECT
4949
QUEUED
5050
> DISCARD
5151
OK
5252
```
5353

54-
[`WATCH`](https://redis.io/commands/watch) 命令用于监听指定的键,当调用 `EXEC` 命令执行事务时,如果一个被 `WATCH` 命令监视的键被修改的话,整个事务都不会执行,直接返回失败。
54+
你可以通过[`WATCH`](https://redis.io/commands/watch) 命令监听指定的 Key,当调用 `EXEC` 命令执行事务时,如果一个被 `WATCH` 命令监视的 Key 被 **其他客户端/Session** 修改的话,整个事务都不会被执行。
55+
56+
```bash
57+
# 客户端 1
58+
> SET PROJECT "RustGuide"
59+
OK
60+
> WATCH PROJECT
61+
OK
62+
> MULTI
63+
OK
64+
> SET PROJECT "JavaGuide"
65+
QUEUED
66+
67+
# 客户端 2
68+
# 在客户端 1 执行 EXEC 命令提交事务之前修改 PROJECT 的值
69+
> SET PROJECT "GoGuide"
70+
71+
# 客户端 1
72+
# 修改失败,因为 PROJECT 的值被客户端2修改了
73+
> EXEC
74+
(nil)
75+
> GET PROJECT
76+
"GoGuide"
77+
```
78+
79+
不过,如果 **WATCH****事务** 在同一个 Session 里,并且被 **WATCH** 监视的 Key 被修改的操作发生在事务内部,这个事务是可以被执行成功的(相关 issue :[WATCH 命令碰到 MULTI 命令时的不同效果](https://github.com/Snailclimb/JavaGuide/issues/1714))。
80+
81+
事务内部修改 WATCH 监视的 Key:
5582

5683
```bash
57-
> WATCH USER
84+
> SET PROJECT "JavaGuide"
85+
OK
86+
> WATCH PROJECT
87+
OK
88+
> MULTI
89+
OK
90+
> SET PROJECT "JavaGuide1"
91+
QUEUED
92+
> SET PROJECT "JavaGuide2"
93+
QUEUED
94+
> SET PROJECT "JavaGuide3"
95+
QUEUED
96+
> EXEC
97+
1) OK
98+
2) OK
99+
3) OK
100+
127.0.0.1:6379> GET PROJECT
101+
"JavaGuide3"
102+
```
103+
104+
事务外部修改 WATCH 监视的 Key:
105+
106+
```bash
107+
> SET PROJECT "JavaGuide"
108+
OK
109+
> WATCH PROJECT
110+
OK
111+
> SET PROJECT "JavaGuide2"
58112
OK
59113
> MULTI
60-
> SET USER "Guide哥"
61114
OK
62115
> GET USER
63-
Guide哥
116+
QUEUED
64117
> EXEC
65-
ERR EXEC without MULTI
118+
(nil)
66119
```
67120

68121
Redis 官网相关介绍 [https://redis.io/topics/transactions](https://redis.io/topics/transactions) 如下:

docs/distributed-system/rpc/rpc-intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Dubbo 提供了从服务定义、服务发现、服务通信到流量管控等
6666

6767
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/distributed-system/rpc/image-20220716111545343.png)
6868

69-
Dubbo 是由阿里开源,后来加入了 Apache 。正式由于 Dubbo 的出现,才使得越来越多的公司开始使用以及接受分布式架构。
69+
Dubbo 是由阿里开源,后来加入了 Apache 。正是由于 Dubbo 的出现,才使得越来越多的公司开始使用以及接受分布式架构。
7070

7171
Dubbo 算的是比较优秀的国产开源项目了,它的源码也是非常值得学习和阅读的!
7272

docs/home.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,13 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
126126
- [Java 10 新特性概览](./java/new-features/java10.md)
127127
- [Java 11 新特性概览](./java/new-features/java11.md)
128128
- [Java 12~13 新特性概览](./java/new-features/java12-13.md)
129-
- [Java 14~15 新特性概览](./java/new-features/java14-15.md)
129+
- [Java 14 新特性概览](./java/new-features/java14.md)
130+
- [Java 15 新特性概览](./java/new-features/java15.md)
130131
- [Java 16 新特性概览](./java/new-features/java16.md)
132+
- [Java 17 新特性概览](./java/new-features/java17.md)
131133
- [Java 18 新特性概览](./java/new-features/java18.md)
132134
- [Java 19 新特性概览](./java/new-features/java19.md)
133135

134-
![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png)
135-
136136
## 计算机基础
137137

138138
### 操作系统
@@ -346,8 +346,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
346346
- [ZooKeeper 相关概念总结(进阶)](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md)
347347
- [ZooKeeper 实战](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md)
348348

349-
![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png)
350-
351349
## 高性能
352350

353351
### 消息队列

docs/java/basis/proxy.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ extends Callback{
277277

278278
```
279279

280-
1. **obj** : 动态生成的代理对象
280+
1. **obj** : 被代理的对象(需要增强的对象)
281281
2. **method** : 被拦截的方法(需要增强的方法)
282282
3. **args** : 方法入参
283283
4. **proxy** : 用于调用原始方法
@@ -330,7 +330,7 @@ public class DebugMethodInterceptor implements MethodInterceptor {
330330

331331

332332
/**
333-
* @param o 代理对象(增强的对象
333+
* @param o 被代理的对象(需要增强的对象
334334
* @param method 被拦截的方法(需要增强的方法)
335335
* @param args 方法入参
336336
* @param methodProxy 用于调用原始方法

docs/java/basis/spi.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ SPI 将服务接口和具体的服务实现分离开来,将服务调用方和
4848

4949
## 实战演示
5050

51-
Spring 框架提供的日志服务 SLF4J 其实只是一个日志门面(接口),但是 SLF4J 的具体实现可以有几种,比如:Logback、Log4j、Log4j2 等等,而且还可以切换,在切换日志具体实现的时候我们是不需要更改项目代码的,只需要在 Maven 依赖里面修改一些 pom 依赖就好了。
51+
SLF4J (Simple Logging Facade for Java)是 Java 的一个日志门面(接口),其具体实现有几种,比如:Logback、Log4j、Log4j2 等等,而且还可以切换,在切换日志具体实现的时候我们是不需要更改项目代码的,只需要在 Maven 依赖里面修改一些 pom 依赖就好了。
5252

5353
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/basis/spi/image-20220723213306039-165858318917813.png)
5454

@@ -236,7 +236,7 @@ public class Logback implements Logger {
236236

237237
这里先大概解释一下:Java 中的 SPI 机制就是在每次类加载的时候会先去找到 class 相对目录下的 `META-INF` 文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。
238238

239-
所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有过个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。
239+
所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。
240240

241241
接下来同样将 `service-provider` 项目打包成 jar 包,这个 jar 包就是服务提供方的实现。通常我们导入 maven 的 pom 依赖就有点类似这种,只不过我们现在没有将这个 jar 包发布到 maven 公共仓库中,所以在需要使用的地方只能手动的添加到项目中。
242242

docs/java/collection/java-collection-precautions-for-use.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ public static <T> T requireNonNull(T obj) {
123123
这就导致 `Iterator` 莫名其妙地发现自己有元素被 `remove/add` ,然后,它就会抛出一个 `ConcurrentModificationException` 来提示用户发生了并发修改异常。这就是单线程状态下产生的 **fail-fast 机制**
124124

125125
> **fail-fast 机制** :多个线程对 fail-fast 集合进行修改的时候,可能会抛出`ConcurrentModificationException`。 即使是单线程下也有可能会出现这种情况,上面已经提到过。
126+
>
127+
> 相关阅读:[什么是fail-fast](https://www.cnblogs.com/54chensongxia/p/12470446.html)
126128
127129
Java8 开始,可以使用 `Collection#removeIf()`方法删除满足特定条件的元素,如
128130

docs/java/concurrent/java-concurrent-collections.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ implements List<E>, RandomAccess, Cloneable, Serializable
6363

6464
```
6565

66-
#### 3.3.2 CopyOnWriteArrayList 写入操作的实现
66+
#### CopyOnWriteArrayList 写入操作的实现
6767

6868
`CopyOnWriteArrayList` 写入操作 `add()`方法在添加集合的时候加了锁,保证了同步,避免了多线程写的时候会 copy 出多个副本出来。
6969

0 commit comments

Comments
 (0)