From 1649e9841abbdd2ee292699befbf764082e44e64 Mon Sep 17 00:00:00 2001
From: D <122281742@qq.com>
Date: Fri, 4 Dec 2020 11:37:07 +0800
Subject: [PATCH 01/13] =?UTF-8?q?=E5=8D=95=E8=AF=8D=E4=BF=AE=E6=94=B9?=
=?UTF-8?q?=EF=BC=9AExtention=20ClassLoader=20=3D>=20Extension=20ClassLoad?=
=?UTF-8?q?er?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...7\235\345\270\246\344\275\240\350\256\244\350\257\206JVM.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/java/jvm/[\345\212\240\351\244\220]\345\244\247\347\231\275\350\257\235\345\270\246\344\275\240\350\256\244\350\257\206JVM.md" "b/docs/java/jvm/[\345\212\240\351\244\220]\345\244\247\347\231\275\350\257\235\345\270\246\344\275\240\350\256\244\350\257\206JVM.md"
index 34709644503..db8ee340ca0 100644
--- "a/docs/java/jvm/[\345\212\240\351\244\220]\345\244\247\347\231\275\350\257\235\345\270\246\344\275\240\350\256\244\350\257\206JVM.md"
+++ "b/docs/java/jvm/[\345\212\240\351\244\220]\345\244\247\347\231\275\350\257\235\345\270\246\344\275\240\350\256\244\350\257\206JVM.md"
@@ -101,7 +101,7 @@ GC将无用对象从内存中卸载
加载一个Class类的顺序也是有优先级的,类加载器从最底层开始往上的顺序是这样的
1. BootStrap ClassLoader:rt.jar
-2. Extention ClassLoader: 加载扩展的jar包
+2. Extension ClassLoader: 加载扩展的jar包
3. App ClassLoader:指定的classpath下面的jar包
4. Custom ClassLoader:自定义的类加载器
From 2759e1bcc74fd8aca89fac595fc3be6b41b9ea2f Mon Sep 17 00:00:00 2001
From: Vanilla <25173827+VergeDX@users.noreply.github.com>
Date: Fri, 4 Dec 2020 20:53:52 +0800
Subject: [PATCH 02/13] =?UTF-8?q?[F]=20Missing=20markdown=20bold=20**=20sy?=
=?UTF-8?q?mbol=20in=20Java=E5=9F=BA=E7=A1=80=E7=9F=A5=E8=AF=86.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Java\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
index 8038016104b..85013b2cdd5 100644
--- "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
+++ "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
@@ -541,7 +541,7 @@ private static class CharacterCache {
}
```
-两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。**
+**两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。**
```java
Integer i1 = 33;
From 6ee3db6fd95248fac6b87657ca58e001e233a5cc Mon Sep 17 00:00:00 2001
From: "hailong.sha"
Date: Mon, 7 Dec 2020 15:03:06 +0800
Subject: [PATCH 03/13] =?UTF-8?q?Update=20=E4=B8=87=E5=AD=97=E8=AF=A6?=
=?UTF-8?q?=E8=A7=A3ThreadLocal=E5=85=B3=E9=94=AE=E5=AD=97.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
formation update
---
...al\345\205\263\351\224\256\345\255\227.md" | 39 +++++++++----------
1 file changed, 19 insertions(+), 20 deletions(-)
diff --git "a/docs/java/multi-thread/\344\270\207\345\255\227\350\257\246\350\247\243ThreadLocal\345\205\263\351\224\256\345\255\227.md" "b/docs/java/multi-thread/\344\270\207\345\255\227\350\257\246\350\247\243ThreadLocal\345\205\263\351\224\256\345\255\227.md"
index 6383ef1dba8..211f7aeeca4 100644
--- "a/docs/java/multi-thread/\344\270\207\345\255\227\350\257\246\350\247\243ThreadLocal\345\205\263\351\224\256\345\255\227.md"
+++ "b/docs/java/multi-thread/\344\270\207\345\255\227\350\257\246\350\247\243ThreadLocal\345\205\263\351\224\256\345\255\227.md"
@@ -35,7 +35,7 @@
public class ThreadLocalTest {
private List messages = Lists.newArrayList();
- public static final `ThreadLocal` holder = `ThreadLocal`.withInitial(ThreadLocalTest::new);
+ public static final ThreadLocal holder = ThreadLocal.withInitial(ThreadLocalTest::new);
public static void add(String message) {
holder.get().messages.add(message);
@@ -70,8 +70,7 @@ size: 0

-
-`Thread`类有一个类型为``ThreadLocal`.`ThreadLocalMap``的实例变量`threadLocals`,也就是说每个线程有一个自己的`ThreadLocalMap`。
+`Thread`类有一个类型为`ThreadLocal.ThreadLocalMap`的实例变量`threadLocals`,也就是说每个线程有一个自己的`ThreadLocalMap`。
`ThreadLocalMap`有自己的独立实现,可以简单地将它的`key`视作`ThreadLocal`,`value`为代码中放入的值(实际上`key`并不是`ThreadLocal`本身,而是它的一个**弱引用**)。
@@ -79,11 +78,11 @@ size: 0
`ThreadLocalMap`有点类似`HashMap`的结构,只是`HashMap`是由**数组+链表**实现的,而`ThreadLocalMap`中并没有**链表**结构。
-我们还要注意`Entry`, 它的`key`是``ThreadLocal`> k` ,继承自`WeakReference, 也就是我们常说的弱引用类型。
+我们还要注意`Entry`, 它的`key`是`ThreadLocal> k` ,继承自`WeakReference`, 也就是我们常说的弱引用类型。
### GC 之后key是否为null?
-回应开头的那个问题, `ThreadLocal` 的`key`是弱引用,那么在` `ThreadLocal`.get()`的时候,发生`GC`之后,`key`是否是`null`?
+回应开头的那个问题, `ThreadLocal` 的`key`是弱引用,那么在`ThreadLocal.get()`的时候,发生`GC`之后,`key`是否是`null`?
为了搞清楚这个问题,我们需要搞清楚`Java`的**四种引用类型**:
@@ -110,7 +109,7 @@ public class ThreadLocalDemo {
private static void test(String s,boolean isGC) {
try {
- new `ThreadLocal`<>().set(s);
+ new ThreadLocal<>().set(s);
if (isGC) {
System.gc();
}
@@ -118,11 +117,11 @@ public class ThreadLocalDemo {
Class extends Thread> clz = t.getClass();
Field field = clz.getDeclaredField("threadLocals");
field.setAccessible(true);
- Object `ThreadLocalMap` = field.get(t);
- Class> tlmClass = `ThreadLocalMap`.getClass();
+ Object ThreadLocalMap = field.get(t);
+ Class> tlmClass = ThreadLocalMap.getClass();
Field tableField = tlmClass.getDeclaredField("table");
tableField.setAccessible(true);
- Object[] arr = (Object[]) tableField.get(`ThreadLocalMap`);
+ Object[] arr = (Object[]) tableField.get(ThreadLocalMap);
for (Object o : arr) {
if (o != null) {
Class> entryClass = o.getClass();
@@ -142,8 +141,8 @@ public class ThreadLocalDemo {
结果如下:
```java
-弱引用key:java.lang.`ThreadLocal`@433619b6,值:abc
-弱引用key:java.lang.`ThreadLocal`@418a15e3,值:java.lang.ref.SoftReference@bf97a12
+弱引用key:java.lang.ThreadLocal@433619b6,值:abc
+弱引用key:java.lang.ThreadLocal@418a15e3,值:java.lang.ref.SoftReference@bf97a12
--gc后--
弱引用key:null,值:def
```
@@ -162,7 +161,7 @@ new ThreadLocal<>().set(s);
这个问题刚开始看,如果没有过多思考,**弱引用**,还有**垃圾回收**,那么肯定会觉得是`null`。
-其实是不对的,因为题目说的是在做 ``ThreadLocal`.get()` 操作,证明其实还是有**强引用**存在的,所以 `key` 并不为 `null`,如下图所示,`ThreadLocal`的**强引用**仍然是存在的。
+其实是不对的,因为题目说的是在做 `ThreadLocal.get()` 操作,证明其实还是有**强引用**存在的,所以 `key` 并不为 `null`,如下图所示,`ThreadLocal`的**强引用**仍然是存在的。

@@ -217,8 +216,8 @@ public class ThreadLocal {
return nextHashCode.getAndAdd(HASH_INCREMENT);
}
- static class `ThreadLocalMap` {
- `ThreadLocalMap`(`ThreadLocal`> firstKey, Object firstValue) {
+ static class ThreadLocalMap {
+ ThreadLocalMap(ThreadLocal> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
@@ -230,7 +229,7 @@ public class ThreadLocal {
}
```
-每当创建一个`ThreadLocal`对象,这个``ThreadLocal`.nextHashCode` 这个值就会增长 `0x61c88647` 。
+每当创建一个`ThreadLocal`对象,这个`ThreadLocal.nextHashCode` 这个值就会增长 `0x61c88647` 。
这个值很特殊,它是**斐波那契数** 也叫 **黄金分割数**。`hash`增量为 这个数字,带来的好处就是 `hash` **分布非常均匀**。
@@ -244,7 +243,7 @@ public class ThreadLocal {
> **注明:** 下面所有示例图中,**绿色块**`Entry`代表**正常数据**,**灰色块**代表`Entry`的`key`值为`null`,**已被垃圾回收**。**白色块**表示`Entry`为`null`。
-虽然`ThreadLocalMap`中使用了**黄金分隔数来**作为`hash`计算因子,大大减少了`Hash`冲突的概率,但是仍然会存在冲突。
+虽然`ThreadLocalMap`中使用了**黄金分割数来**作为`hash`计算因子,大大减少了`Hash`冲突的概率,但是仍然会存在冲突。
`HashMap`中解决冲突的方法是在数组上构造一个**链表**结构,冲突的数据挂载到链表上,如果链表长度超过一定数量则会转化成**红黑树**。
@@ -403,7 +402,7 @@ private static int prevIndex(int i, int len) {
`java.lang.ThreadLocal.ThreadLocalMap.replaceStaleEntry()`:
```java
-private void replaceStaleEntry(`ThreadLocal`> key, Object value,
+private void replaceStaleEntry(ThreadLocal> key, Object value,
int staleSlot) {
Entry[] tab = table;
int len = tab.length;
@@ -687,7 +686,7 @@ private void resize() {

-我们以`get(ThreadLocal1)`为例,通过`hash`计算后,正确的`slot`位置应该是4,而`index=4`的槽位已经有了数据,且`key`值不等于``ThreadLocal`1`,所以需要继续往后迭代查找。
+我们以`get(ThreadLocal1)`为例,通过`hash`计算后,正确的`slot`位置应该是4,而`index=4`的槽位已经有了数据,且`key`值不等于`ThreadLocal1`,所以需要继续往后迭代查找。
迭代到`index=5`的数据时,此时`Entry.key=null`,触发一次探测式数据回收操作,执行`expungeStaleEntry()`方法,执行完后,`index 5,8`的数据都会被回收,而`index 6,7`的数据都会前移,此时继续往后迭代,到`index = 6`的时候即找到了`key`值相等的`Entry`数据,如下图所示:
@@ -698,7 +697,7 @@ private void resize() {
`java.lang.ThreadLocal.ThreadLocalMap.getEntry()`:
```java
-private Entry getEntry(`ThreadLocal`> key) {
+private Entry getEntry(ThreadLocal> key) {
int i = key.threadLocalHashCode & (table.length - 1);
Entry e = table[i];
if (e != null && e.get() == key)
@@ -707,7 +706,7 @@ private Entry getEntry(`ThreadLocal`> key) {
return getEntryAfterMiss(key, i, e);
}
-private Entry getEntryAfterMiss(`ThreadLocal`> key, int i, Entry e) {
+private Entry getEntryAfterMiss(ThreadLocal> key, int i, Entry e) {
Entry[] tab = table;
int len = tab.length;
From fd11d51ed7e49e84e98c034c9c15d43132cb8b6d Mon Sep 17 00:00:00 2001
From: LIU
Date: Tue, 8 Dec 2020 22:23:44 +0800
Subject: [PATCH 04/13] =?UTF-8?q?Update=20=E6=95=B0=E6=8D=AE=E5=BA=93?=
=?UTF-8?q?=E7=B4=A2=E5=BC=95.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...25\260\346\215\256\345\272\223\347\264\242\345\274\225.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" "b/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md"
index 568ba833fab..e4e76c968b6 100644
--- "a/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md"
+++ "b/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md"
@@ -6,7 +6,7 @@
## 为什么要用索引?索引的优缺点分析
### 索引的优点
-**可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的。 ** 另外,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
+**可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的。** 另外,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
### 索引的缺点
1. **创建索引和维护索引需要耗费许多时间**:当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低SQL执行效率。
@@ -222,4 +222,4 @@ ALTER TABLE table ADD INDEX index_name (num,name,age)
### 使用索引一定能提高查询性能吗?
-大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
\ No newline at end of file
+大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
From f4fad2f63d0d8c309154a9f985354c63c8223280 Mon Sep 17 00:00:00 2001
From: LIU
Date: Fri, 11 Dec 2020 14:58:36 +0800
Subject: [PATCH 05/13] fix OSPF error
---
...\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md"
index cbd9f0d9d63..688d7f3e0e8 100644
--- "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md"
+++ "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md"
@@ -189,7 +189,7 @@ TCP的拥塞控制采用了四种算法,即 **慢开始** 、 **拥塞避免**
-> 上图有一个错误,请注意,是OSPF不是OPSF。 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是由Internet工程任务组开发的路由选择协议
+> 上图有一个错误,请注意,是OSPF不是OPSF。 OSPF(Open Shortest Path First,ospf)开放最短路径优先协议,是由Internet工程任务组开发的路由选择协议
总体来说分为以下几个过程:
From 19d31b154fb87d4696e317273097c5ae999eff94 Mon Sep 17 00:00:00 2001
From: LIU
Date: Sat, 12 Dec 2020 18:03:21 +0800
Subject: [PATCH 06/13] fix markdown error
---
...25\260\346\215\256\345\272\223\347\264\242\345\274\225.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" "b/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md"
index 568ba833fab..90f3ae3ed09 100644
--- "a/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md"
+++ "b/docs/database/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md"
@@ -58,7 +58,7 @@ B+树是有序的,在这种范围查询中,优势非常大,直接遍历比
**PS:不懂的同学可以暂存疑,慢慢往下看,后面会有答案的,也可以自行搜索。**
-1. **唯一索引(Unique Key)** :唯一索引也是一种约束。**唯一索引的属性列不能出现重复的数据,但是允许数据为NULL,一张表允许创建多个唯一索引。**建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
+1. **唯一索引(Unique Key)** :唯一索引也是一种约束。**唯一索引的属性列不能出现重复的数据,但是允许数据为NULL,一张表允许创建多个唯一索引。** 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
2. **普通索引(Index)** :**普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和NULL。**
3. **前缀索引(Prefix)** :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小,
因为只取前几个字符。
@@ -222,4 +222,4 @@ ALTER TABLE table ADD INDEX index_name (num,name,age)
### 使用索引一定能提高查询性能吗?
-大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
\ No newline at end of file
+大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
From 6cc0e4c528d660a01303af3b238d09f2ddafd4b2 Mon Sep 17 00:00:00 2001
From: LIU
Date: Sun, 13 Dec 2020 17:18:07 +0800
Subject: [PATCH 07/13] =?UTF-8?q?Update=20java=E7=BA=BF=E7=A8=8B=E6=B1=A0?=
=?UTF-8?q?=E5=AD=A6=E4=B9=A0=E6=80=BB=E7=BB=93.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
index 890588a2672..06a26a4dec2 100644
--- "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
+++ "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
@@ -341,7 +341,7 @@ pool-1-thread-2 End. Time = Sun Apr 12 11:14:47 CST 2020
现在,我们就分析上面的输出内容来简单分析一下线程池原理。
-**为了搞懂线程池的原理,我们需要首先分析一下 `execute`方法。**在 4.1 节中的 Demo 中我们使用 `executor.execute(worker)`来提交一个任务到线程池中去,这个方法非常重要,下面我们来看看它的源码:
+**为了搞懂线程池的原理,我们需要首先分析一下 `execute`方法。** 在 4.1 节中的 Demo 中我们使用 `executor.execute(worker)`来提交一个任务到线程池中去,这个方法非常重要,下面我们来看看它的源码:
```java
// 存放线程池的运行状态 (runState) 和线程池内有效线程的数量 (workerCount)
From 40a601459535384124ca0aba88052755e9a9ec08 Mon Sep 17 00:00:00 2001
From: LIU
Date: Sun, 13 Dec 2020 17:30:14 +0800
Subject: [PATCH 08/13] =?UTF-8?q?Update=20java=E7=BA=BF=E7=A8=8B=E6=B1=A0?=
=?UTF-8?q?=E5=AD=A6=E4=B9=A0=E6=80=BB=E7=BB=93.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
index 890588a2672..99e4e8d188f 100644
--- "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
+++ "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md"
@@ -543,7 +543,7 @@ public interface Callable {
#### 4.3.2 `execute()` vs `submit()`
1. **`execute()`方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;**
-2. **`submit()`方法用于提交需要返回值的任务。线程池会返回一个 `Future` 类型的对象,通过这个 `Future` 对象可以判断任务是否执行成功**,并且可以通过 `Future` 的 `get()`方法来获取返回值,`get()`方法会阻塞当前线程直到任务完成,而使用 `get(long timeout,TimeUnit unit)`方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
+2. **`submit()`方法用于提交需要返回值的任务。线程池会返回一个 `Future` 类型的对象,通过这个 `Future` 对象可以判断任务是否执行成功** ,并且可以通过 `Future` 的 `get()`方法来获取返回值,`get()`方法会阻塞当前线程直到任务完成,而使用 `get(long timeout,TimeUnit unit)`方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
我们以**`AbstractExecutorService`**接口中的一个 `submit` 方法为例子来看看源代码:
From 2c17d288e2437e05bef2605af78ae4596ccb26af Mon Sep 17 00:00:00 2001
From: LIU
Date: Sun, 13 Dec 2020 19:00:52 +0800
Subject: [PATCH 09/13] =?UTF-8?q?Update=20=E4=BA=8B=E5=8A=A1=E9=9A=94?=
=?UTF-8?q?=E7=A6=BB=E7=BA=A7=E5=88=AB(=E5=9B=BE=E6=96=87=E8=AF=A6?=
=?UTF-8?q?=E8=A7=A3).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...53(\345\233\276\346\226\207\350\257\246\350\247\243).md" | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git "a/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md" "b/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md"
index 449b7fa7858..95da8be960d 100644
--- "a/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md"
+++ "b/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md"
@@ -80,11 +80,11 @@ mysql> SELECT @@tx_isolation;
+-----------------+
```
-这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** 事务隔离级别下,允许应用使用 Next-Key Lock 锁算法来避免幻读的产生。这与其他数据库系统(如 SQL Server)是不同的。所以说虽然 InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)**,但是可以通过应用加锁读(例如 `select * from table for update` 语句)来保证不会产生幻读,而这个加锁度使用到的机制就是 Next-Key Lock 锁算法。从而达到了 SQL 标准的 **SERIALIZABLE(可串行化)** 隔离级别。
+这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** 事务隔离级别下,允许应用使用 Next-Key Lock 锁算法来避免幻读的产生。这与其他数据库系统(如 SQL Server)是不同的。所以说虽然 InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** ,但是可以通过应用加锁读(例如 `select * from table for update` 语句)来保证不会产生幻读,而这个加锁度使用到的机制就是 Next-Key Lock 锁算法。从而达到了 SQL 标准的 **SERIALIZABLE(可串行化)** 隔离级别。
-因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是**READ-COMMITTED(读取提交内容):**,但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。
+因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是**READ-COMMITTED(读取提交内容):**,但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)** 并不会有任何性能损失。
-InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到**SERIALIZABLE(可串行化)**隔离级别。
+InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到**SERIALIZABLE(可串行化)** 隔离级别。
### 实际情况演示
From 4c080d20762fb02fdcb6c33556972e3f87b58676 Mon Sep 17 00:00:00 2001
From: LIU
Date: Sun, 13 Dec 2020 19:07:34 +0800
Subject: [PATCH 10/13] =?UTF-8?q?Update=20=E5=87=A0=E9=81=93=E5=B8=B8?=
=?UTF-8?q?=E8=A7=81=E7=9A=84=E9=93=BE=E8=A1=A8=E7=AE=97=E6=B3=95=E9=A2=98?=
=?UTF-8?q?.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\223\276\350\241\250\347\256\227\346\263\225\351\242\230.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\351\223\276\350\241\250\347\256\227\346\263\225\351\242\230.md" "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\351\223\276\350\241\250\347\256\227\346\263\225\351\242\230.md"
index 85e2934e407..9daa0fc159c 100644
--- "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\351\223\276\350\241\250\347\256\227\346\263\225\351\242\230.md"
+++ "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\351\223\276\350\241\250\347\256\227\346\263\225\351\242\230.md"
@@ -324,7 +324,7 @@ public class Solution {
**进阶——一次遍历法:**
-> **链表中倒数第N个节点也就是正数第(L-N+1)个节点。
+> 链表中倒数第N个节点也就是正数第(L-N+1)个节点。
其实这种方法就和我们上面第四题找“链表中倒数第k个节点”所用的思想是一样的。**基本思路就是:** 定义两个节点 node1、node2;node1 节点先跑,node1节点 跑到第 n+1 个节点的时候,node2 节点开始跑.当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点(L代表总链表长度,也就是倒数第 n+1 个节点)
From a636eb72022513016c455f2b3273334376c0ea9b Mon Sep 17 00:00:00 2001
From: sleepingraven <1013232611@qq.com>
Date: Tue, 15 Dec 2020 16:43:55 +0800
Subject: [PATCH 11/13] Update java-learning-path-and-methods.md
---
docs/questions/java-learning-path-and-methods.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/questions/java-learning-path-and-methods.md b/docs/questions/java-learning-path-and-methods.md
index 87f7f19bbfa..cdb8098b370 100644
--- a/docs/questions/java-learning-path-and-methods.md
+++ b/docs/questions/java-learning-path-and-methods.md
@@ -35,7 +35,7 @@
3. [【加餐】一些重要的Java程序设计题](https://snailclimb.gitee.io/javaguide/#/docs/java/Java程序设计题)
4. [【选看】J2EE 基础知识](https://snailclimb.gitee.io/javaguide/#/docs/java/J2EE基础知识)
-> 我们的网站需要运行在“操作系统”之上(一般是部署在Linux系统),并且我们与网站的每次交互都需要经过“网络”,需要经历三次握手和四次挥手才能简历连接,需要HTTP才能发出请求已经拿到网站后台的相应。所以第二步,我推荐可以适当花时间看一下 **操作系统与计算机网络 方面的知识。** 但是,不做强求!你抽时间一定要补上就行!
+> 我们的网站需要运行在“操作系统”之上(一般是部署在Linux系统),并且我们与网站的每次交互都需要经过“网络”,需要经历三次握手和四次挥手才能建立连接,需要HTTP才能发出请求已经拿到网站后台的相应。所以第二步,我推荐可以适当花时间看一下 **操作系统与计算机网络 方面的知识。** 但是,不做强求!你抽时间一定要补上就行!
### step 2(可选):操作系统与计算机网络
From bb63e556a384a366fc3b5005fae4a5e88f821754 Mon Sep 17 00:00:00 2001
From: sleepingraven <1013232611@qq.com>
Date: Tue, 15 Dec 2020 18:33:06 +0800
Subject: [PATCH 12/13] Update java-learning-website-blog.md
---
docs/questions/java-learning-website-blog.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/questions/java-learning-website-blog.md b/docs/questions/java-learning-website-blog.md
index 06ef65fe14c..d9ba95fae99 100644
--- a/docs/questions/java-learning-website-blog.md
+++ b/docs/questions/java-learning-website-blog.md
@@ -68,7 +68,7 @@
### 一些不错的博客/Github 推荐
-- SnailClimb 的 Github :[https://github.com/Snailclimb](https://github.com/Snailclimb "https://github.com/Snailclimb") 。(自荐一波哈!主要专注在 Java 基础和进阶、Spring、Spiring Boot、Java 面试这方面。)
+- SnailClimb 的 Github :[https://github.com/Snailclimb](https://github.com/Snailclimb "https://github.com/Snailclimb") 。(自荐一波哈!主要专注在 Java 基础和进阶、Spring、Spring Boot、Java 面试这方面。)
- 徐靖峰个人博客 :[https://www.cnkirito.moe/](https://www.cnkirito.moe/ "https://www.cnkirito.moe/")(探讨 Java 生态的知识点,内容覆盖分布式服务治理、微服务、性能调优、各类源码分析)
- 田小波:[http://www.tianxiaobo.com/](http://www.tianxiaobo.com/ "http://www.tianxiaobo.com/") (Java 、Spring 、MyBatis 、Dubbo)
- 周立的博客: [http://www.itmuch.com/](http://www.itmuch.com/ "http://www.itmuch.com/")(Spring Cloud、Docker、Kubernetes,及其相关生态的技术)
@@ -77,4 +77,4 @@
- 纯洁的微笑 : [http://www.ityouknow.com/](http://www.ityouknow.com/ "http://www.ityouknow.com/") (Java、SpringBoot、Spring Cloud)
- 芋道源码: [http://www.iocoder.cn/](http://www.iocoder.cn/ "http://www.iocoder.cn/") (专注源码)。
- 欢迎自荐
-- ......
\ No newline at end of file
+- ......
From be2decb445af0e802cff214aacd34e33388d8f57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guide=E5=93=A5?=
Date: Tue, 15 Dec 2020 20:39:15 +0800
Subject: [PATCH 13/13] Update java-learning-path-and-methods.md
---
docs/questions/java-learning-path-and-methods.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/questions/java-learning-path-and-methods.md b/docs/questions/java-learning-path-and-methods.md
index cdb8098b370..87c89deb63b 100644
--- a/docs/questions/java-learning-path-and-methods.md
+++ b/docs/questions/java-learning-path-and-methods.md
@@ -172,11 +172,11 @@
### step 10:深入学习
-可以再回来看一下多线程方面的知识,还可以利用业余时间学习一下 **[NIO](https://github.com/Snailclimb/JavaGuide#io "NIO")** 和 **Netty** ,这样简历上也可以多点东西。如果想去大厂,**[JVM](https://github.com/Snailclimb/JavaGuide#jvm "JVM")** 的一些知识也是必学的(**Java 内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM 内存管理**)推荐《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(最新第二版》和《实战 Java 虚拟机》,如果嫌看书麻烦的话,你也可以看我整理的文档。
+可以再回来看一下多线程方面的知识,还可以利用业余时间学习一下 **[NIO](https://github.com/Snailclimb/JavaGuide#io "NIO")** 和 **Netty** ,这样简历上也可以多点东西。如果想去大厂,**[JVM](https://github.com/Snailclimb/JavaGuide#jvm "JVM")** 的一些知识也是必学的(**Java 内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM 内存管理**)推荐《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(最新第二版)》和《实战 Java 虚拟机》,如果嫌看书麻烦的话,你也可以看我整理的文档。
另外,现在微服务特别火,很多公司在面试也明确要求需要微服务方面的知识。如果有精力的话可以去学一下 SpringCloud 生态系统微服务方面的东西。
-> **微服务的概念庞大,技术种类也很多,但是目前大型互联网公司广泛采用的,**实话实话这些东西我不在行,自己没有真实做过微服务的项目。不过下面是我自己总结的一些关于微服务比价重要的知识,选学。
+> **微服务的概念庞大,技术种类也很多,但是目前大型互联网公司广泛采用的,** 实话实话这些东西我不在行,自己没有真实做过微服务的项目。不过下面是我自己总结的一些关于微服务比价重要的知识,选学。
### step 11:微服务