Skip to content

Commit dfe0d53

Browse files
authored
Merge pull request #3 from CyC2018/master
5.6更新
2 parents 8aece39 + f82827d commit dfe0d53

20 files changed

+2949
-2011
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
*.txt
1+
*.txt
2+
.idea/

README.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
|||||||||||
33
| :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:|
44
| 算法[:pencil2:](#算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
5-
</br>
6-
7-
:loudspeaker: 本仓库不参与商业行为,不向读者收取任何费用。
85

9-
:loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.
10-
</br></br>
6+
本仓库不参与商业行为,不向读者收取任何费用。(This repository is not engaging in business activities, and does not charge readers any fee.)
7+
</br>
118

129
## 算法 :pencil2:
1310

@@ -147,9 +144,9 @@ Google 开源项目的代码风格规范。
147144

148145
**关于贡献**
149146

150-
因为大部分内容是笔者一个字一个字打上去的,所有难免会有一些笔误。如果发现,可以直接在相应的文档上编辑修改。
147+
因为大部分内容是笔者一个字一个字打上去的,所以难免会有一些笔误。如果发现,可以直接在相应的文档上编辑修改。
151148

152-
笔者能力有限,很多内容还不够完善。如果您希望和笔者一起完善这个仓库,可以在发表一个 Issue,表明您想要添加的内容,笔者会及时查看。
149+
笔者能力有限,很多内容还不够完善。如果您希望和笔者一起完善这个仓库,可以发表一个 Issue,表明您想要添加的内容,笔者会及时查看。
153150

154151
因为不打算将这个仓库做成一个大而全的面试宝典,只希望添加一些比较通用的基础知识,或者是与 Java 和分布式相关的内容,但是不添加 Java Web 相关的内容。
155152

@@ -163,7 +160,7 @@ Google 开源项目的代码风格规范。
163160

164161
**关于排版**
165162

166-
笔记内容按照 [中文文案排版指北](http://mazhuang.org/wiki/chinese-copywriting-guidelines/#%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%9C%B0%E9%81%93%E7%9A%84%E7%BC%A9%E5%86%99) 进行排版,以保证内容的可读性。这里提供了笔者实现的中英混排文档在线排版工具:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting),目前实现了加空格的功能,之后打算实现对英文专有名词提示首字母大写的功能。
163+
笔记内容按照 [中文文案排版指北](http://mazhuang.org/wiki/chinese-copywriting-guidelines/) 进行排版,以保证内容的可读性。这里提供了笔者实现的中英混排文档在线排版工具:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting),目前实现了加空格的功能,之后打算实现对英文专有名词提示首字母大写的功能。
167164

168165
不使用 `![]()` 这种方式来引用图片是为了能够控制图片以合适的大小显示。而且 GFM 不支持 `<center> ![]() </center>` 让图片居中显示,只能使用 `<div align="center"> <img src=""/> </div>` ,所以只能使用 img 标签来引用图片。
169166

notes/HTTP.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@
6363

6464
## Web 基础
6565

66-
- HTTP(HyperText Transfer Protocol,超文本传输协议)
67-
- WWW(World Wide Web)的三种技术:HTML、HTTP、URL
66+
- HTTP(HyperText Transfer Protocol,超文本传输协议)
67+
- WWW(World Wide Web)的三种技术:HTML、HTTP、URL
6868
- RFC(Request for Comments,征求修正意见书),互联网的设计文档。
6969

7070
## URL
7171

7272
- URI(Uniform Resource Indentifier,统一资源标识符)
7373
- URL(Uniform Resource Locator,统一资源定位符)
74-
- URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4
74+
- URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4。
7575

7676
URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。
7777

notes/Java 基础.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ set.add(e2);
269269
System.out.println(set.size()); // 2
270270
```
271271

272-
理想的散列函数应当具有均匀性,即不相等的实例应当均匀分不到所有可能的散列值上。这就要求了散列函数要把所有域的值都考虑进来,可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位。
272+
理想的散列函数应当具有均匀性,即不相等的实例应当均匀分布到所有可能的散列值上。这就要求了散列函数要把所有域的值都考虑进来,可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位。
273273

274274
一个数与 31 相乘可以转换成移位和减法:31\*x == (x<<5)-x。
275275

@@ -506,9 +506,9 @@ protected 用于修饰成员,表示在继承体系中成员对于子类可见
506506

507507
设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。
508508

509-
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里式替换原则
509+
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则
510510

511-
字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。可以使用共有的 getter 和 setter 方法来替换共有字段
511+
字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。可以使用公有的 getter 和 setter 方法来替换公有字段
512512

513513
```java
514514
public class AccessExample {
@@ -634,14 +634,14 @@ System.out.println(InterfaceExample.x);
634634

635635
- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
636636
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
637-
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段可以有多种访问权限
637+
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制
638638
- 接口的方法只能是 public 的,而抽象类的方法可以由多种访问权限。
639639

640640
**4. 使用选择**
641641

642642
使用抽象类:
643643

644-
- 需要在几个相关的类中共享代码
644+
- 需要在几个相关的类中共享代码
645645
- 需要能控制继承来的方法和域的访问权限,而不是都为 public。
646646
- 需要继承非静态(non-static)和非常量(non-final)字段。
647647

@@ -771,7 +771,7 @@ String s5 = "bbb";
771771
System.out.println(s4 == s5); // true
772772
```
773773

774-
Java 虚拟机将堆划分成新生代、老年代和永久代(PermGen Space)。在 Java 7 之前,字符串常量池被放在永久代中,而在 Java 7,它被放在堆的其它位置。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。
774+
在 Java 7 之前,字符串常量池被放在运行时常量池中,它属于永久代。而在 Java 7,字符串常量池被放在堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。
775775

776776
> [What is String interning?](https://stackoverflow.com/questions/10578984/what-is-string-interning) </br> [深入解析 String#intern](https://tech.meituan.com/in_depth_understanding_string_intern.html)
777777

notes/Java 容器.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ private void writeObject(java.io.ObjectOutputStream s)
212212

213213
### 4. 和 LinkedList 的区别
214214

215-
- ArrayList 基于动态数组实现,LinkedList 基于双向循环链表实现
215+
- ArrayList 基于动态数组实现,LinkedList 基于双向链表实现
216216
- ArrayList 支持随机访问,LinkedList 不支持;
217217
- LinkedList 在任意位置添加删除元素更快。
218218

notes/Java 并发.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
* [内存模型三大特性](#内存模型三大特性)
4444
* [先行发生原则](#先行发生原则)
4545
* [十一、线程安全](#十一线程安全)
46+
* [线程安全定义](#线程安全定义)
4647
* [线程安全分类](#线程安全分类)
4748
* [线程安全的实现方法](#线程安全的实现方法)
4849
* [十二、锁优化](#十二锁优化)
@@ -86,7 +87,7 @@
8687

8788
## 限期等待(Timed Waiting)
8889

89-
无需等待其它线程显示地唤醒,在一定时间之后会被系统自动唤醒。
90+
无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
9091

9192
调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。
9293

@@ -188,7 +189,7 @@ public static void main(String[] args) {
188189

189190
## Executor
190191

191-
Executor 管理多个异步任务的执行,而无需程序员显示地管理线程的生命周期
192+
Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期
192193

193194
主要有三种 Executor:
194195

@@ -715,10 +716,10 @@ java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.
715716
public class CountdownLatchExample {
716717

717718
public static void main(String[] args) throws InterruptedException {
718-
final int totalTread = 10;
719-
CountDownLatch countDownLatch = new CountDownLatch(totalTread);
719+
final int totalThread = 10;
720+
CountDownLatch countDownLatch = new CountDownLatch(totalThread);
720721
ExecutorService executorService = Executors.newCachedThreadPool();
721-
for (int i = 0; i < totalTread; i++) {
722+
for (int i = 0; i < totalThread; i++) {
722723
executorService.execute(() -> {
723724
System.out.print("run..");
724725
countDownLatch.countDown();
@@ -747,12 +748,11 @@ run..run..run..run..run..run..run..run..run..run..end
747748

748749
```java
749750
public class CyclicBarrierExample {
750-
751751
public static void main(String[] args) throws InterruptedException {
752-
final int totalTread = 10;
753-
CyclicBarrier cyclicBarrier = new CyclicBarrier(totalTread);
752+
final int totalThread = 10;
753+
CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);
754754
ExecutorService executorService = Executors.newCachedThreadPool();
755-
for (int i = 0; i < totalTread; i++) {
755+
for (int i = 0; i < totalThread; i++) {
756756
executorService.execute(() -> {
757757
System.out.print("before..");
758758
try {
@@ -1235,6 +1235,10 @@ join() 方法返回先行发生于 Thread 对象的结束。
12351235

12361236
# 十一、线程安全
12371237

1238+
## 线程安全定义
1239+
1240+
一个类在可以被多个线程安全调用时就是线程安全的。
1241+
12381242
## 线程安全分类
12391243

12401244
线程安全不是一个非真即假的命题,可以将共享数据按照安全程度的强弱顺序分成以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。
@@ -1507,7 +1511,7 @@ public class ThreadLocalExample1 {
15071511

15081512
<div align="center"> <img src="../pics//3646544a-cb57-451d-9e03-d3c4f5e4434a.png" width=""/> </div><br>
15091513

1510-
每个 Thread 都有一个 TreadLocal.ThreadLocalMap 对象,Thread 类中就定义了 ThreadLocal.ThreadLocalMap 成员。
1514+
每个 Thread 都有一个 ThreadLocal.ThreadLocalMap 对象,Thread 类中就定义了 ThreadLocal.ThreadLocalMap 成员。
15111515

15121516
```java
15131517
/* ThreadLocal values pertaining to this thread. This map is maintained
@@ -1595,7 +1599,7 @@ public static String concatString(String s1, String s2, String s3) {
15951599

15961600
## 轻量级锁
15971601

1598-
轻量级锁是 JDK 1.6 之中加入的新型锁机制,它名字中的“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的,因此传统的锁机制就称为“重量级”锁。首先需要强调一点的是,轻量级锁并不是用来代替重要级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
1602+
轻量级锁是 JDK 1.6 之中加入的新型锁机制,它名字中的“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的,因此传统的锁机制就称为“重量级”锁。首先需要强调一点的是,轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
15991603

16001604
要理解轻量级锁,以及后面会讲到的偏向锁的原理和运作过程,必须从 HotSpot 虚拟机的对象(对象头部分)的内存布局开始介绍。HotSpot 虚拟机的对象头(Object Header)分为两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄(Generational GC Age)等,这部分数据是长度在 32 位和 64 位的虚拟机中分别为 32 bit 和 64 bit,官方称它为“Mark Word”,它是实现轻量级锁和偏向锁的关键。另外一部分用于存储指向方法区对象类型数据的指针,如果是数组对象的话,还会有一个额外的部分用于存储数组长度。
16011605

notes/Java 虚拟机.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ objB.instance = objA;
123123

124124
### 2. 可达性
125125

126-
通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是都是可用的,不可达的对象可被回收。
126+
通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是可用的,不可达的对象可被回收。
127127

128128
<div align="center"> <img src="../pics//0635cbe8.png" width=""/> </div><br>
129129

@@ -142,7 +142,7 @@ Java 对引用的概念进行了扩充,引入四种强度不同的引用类型
142142

143143
**(一)强引用**
144144

145-
只要强引用存在,垃圾回收器永远不会回收掉被引用的对象
145+
只要强引用存在,垃圾回收器永远不会回收被引用的对象
146146

147147
使用 new 一个新对象的方式来创建强引用。
148148

0 commit comments

Comments
 (0)