Skip to content

Commit 0d98e38

Browse files
committed
8.3
1 parent 3ba778f commit 0d98e38

13 files changed

Lines changed: 2375 additions & 401 deletions

ReadMe.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2+
# Java工程师技术指南
3+
14
本仓库原为 [Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。
25

36
## 目录
@@ -197,14 +200,11 @@ todo
197200

198201
## 算法
199202

203+
* [必背代码](docs/code/code.md)
200204
* [必备算法总结](https://www.zhihu.com/question/23148377/answer/907915556)
201-
202205
* [剑指offer](docs/algorithms/剑指offer.md)
203-
204206
* [动态规划](https://www.cxyxiaowu.com/6781.html)
205-
206207
* [十大排序](https://www.zhihu.com/question/51337272/answer/572455307)
207-
208208
* [排序JAVA代码](https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484184&idx=1&sn=62965b401aa42107b3c17d1d8ea17454&chksm=fa0e6c99cd79e58f298e9026f677f912bd8c8e55edb48fc509b2b5834f05e529a9b47d59d202&scene=21#wechat_redirect)
209209

210210

@@ -221,6 +221,8 @@ todo
221221

222222
[操作系统学习总结](docs/operating-system/操作系统学习总结.md)
223223

224+
[操作系统复习](docs/operating-system/操作系统复习.md)
225+
224226
#### Linux相关
225227

226228
[Linux内核与基础命令学习总结](docs/operating-system/Linux内核与基础命令学习总结.md)
@@ -287,6 +289,8 @@ todo
287289

288290
### Kafka
289291

292+
Todo
293+
290294
## 大后端
291295

292296
* [后端技术杂谈开篇:云计算,大数据与AI的故事](docs/big-backEnd/后端技术杂谈开篇:云计算,大数据与AI的故事.md)

docs/code/code.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class SelectionSort implements IArraySort {
7272
// 总共要经过 N-1 轮比较
7373
for (int i = 0; i < arr.length - 1; i++) {
7474
int min = i;
75-
75+
7676
// 每轮需要比较的次数 N-i
7777
for (int j = i + 1; j < arr.length; j++) {
7878
if (arr[j] < arr[min]) {
@@ -173,12 +173,9 @@ public class ShellSort implements IArraySort {
173173

174174
### 快速排序
175175

176-
177-
178-
* 从数列中挑出一个元素,称为 “基准”(pivot);
179-
180-
* 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
181-
* 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
176+
- 从数列中挑出一个元素,称为 “基准”(pivot);
177+
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
178+
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
182179

183180
```java
184181
public class QuickSort implements IArraySort {
@@ -430,4 +427,3 @@ ListNode deleteDuplicates(ListNode head) {
430427
return head;
431428
}
432429
```
433-

docs/index.html

Lines changed: 0 additions & 45 deletions
This file was deleted.

docs/java-web/Spring/Spring源码剖析5:JDK和cglib动态代理原理详解.md

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,6 @@
1414
* [对委托类进行代理](#对委托类进行代理)
1515

1616

17-
转自 https://www.jianshu.com/u/668d0795a95b
18-
19-
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
20-
> https://github.com/h2pl/Java-Tutorial
21-
22-
喜欢的话麻烦点下Star哈
23-
24-
文章将同步到我的个人博客:
25-
> www.how2playlife.com
26-
27-
本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
28-
29-
该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。
30-
31-
后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。
32-
33-
为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。
34-
35-
如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
36-
37-
<!-- more -->
3817
## 前言
3918
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理。
4019

docs/java/currency/Java并发指南3:并发三大问题与volatile关键字,CAS操作.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
return ((b == 0) || (b == -1 && a == 1));
6060
}
6161
}
62-
62+
6363

6464

6565

@@ -181,7 +181,7 @@ Java内存模型没有具体讲述前面讨论的执行策略是由编译器,C
181181
}
182182

183183

184-
184+
185185

186186
假设有多个线程分别调用上面程序的三个方法,这个程序在语意上和下面程序等价:
187187
class VolatileFeaturesExample {
@@ -203,7 +203,7 @@ Java内存模型没有具体讲述前面讨论的执行策略是由编译器,C
203203
}
204204

205205

206-
206+
207207

208208
如上面示例程序所示,对一个volatile变量的单个读/写操作,与对一个普通变量的读/写操作使用同一个监视器锁来同步,它们之间的执行效果相同。
209209

@@ -226,21 +226,21 @@ Java内存模型没有具体讲述前面讨论的执行策略是由编译器,C
226226
class VolatileExample {
227227
int a = 0;
228228
volatile boolean flag = false;
229-
229+
230230
public void writer() {
231231
a = 1; // 1
232232
flag = true; // 2
233233
}
234234
public void reader() {
235-
if (flag) { //3
236-
int i = a; //4
237-
……
238-
}
239-
}
235+
if (flag) { //3
236+
int i = a; //4
237+
……
238+
}
239+
}
240240
}
241241

242242

243-
243+
244244

245245
假设线程A执行writer()方法之后,线程B执行reader()方法。根据happens before规则,这个过程建立的happens before 关系可以分为两类:
246246

@@ -350,7 +350,7 @@ volatile读的内存语义如下:
350350
}
351351

352352

353-
353+
354354

355355
针对readAndWrite()方法,编译器在生成字节码时可以做如下的优化:
356356

@@ -530,7 +530,7 @@ JVM中的CAS操作正是利用了上一节中提到的处理器提供的CMPXCHG
530530
992362
531531
1000000
532532
75
533-
533+
534534

535535

536536

@@ -542,7 +542,7 @@ JVM中的CAS操作正是利用了上一节中提到的处理器提供的CMPXCHG
542542

543543
从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
544544

545-
545+
546546
public boolean compareAndSet(
547547
V expectedReference,//预期引用
548548

docs/java/currency/Java并发指南4:Java中的锁 Lock和synchronized.md

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,6 @@
2121
* [参考资料](#参考资料)
2222

2323

24-
**本文转载自并发编程网,侵删**
25-
26-
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
27-
> https://github.com/h2pl/Java-Tutorial
28-
29-
喜欢的话麻烦点下Star哈
30-
31-
文章同步发于我的个人博客:
32-
> www.how2playlife.com
33-
34-
本文是微信公众号【Java技术江湖】的《Java并发指南》其中一篇,本文大部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
35-
36-
该系列博文会告诉你如何全面深入地学习Java并发技术,从Java多线程基础,再到并发编程的基础知识,从Java并发包的入门和实战,再到JUC的源码剖析,一步步地学习Java并发编程,并上手进行实战,以便让你更完整地了解整个Java并发编程知识体系,形成自己的知识框架。
37-
38-
为了更好地总结和检验你的学习成果,本系列文章也会提供一些对应的面试题以及参考答案。
39-
40-
如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
41-
<!--more -->
4224

4325
## Java中的锁机制及Lock类
4426

@@ -119,7 +101,7 @@
119101
}
120102
}
121103
}
122-
104+
123105
在ReentrantLock中,调用lock()方法获取锁;调用unlock()方法释放锁。
124106

125107
ReentrantLock的实现依赖于java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,马上我们会看到,这个volatile变量是ReentrantLock内存语义实现的关键。 下面是ReentrantLock的类图(仅画出与本文相关的部分):
@@ -244,7 +226,7 @@ ReentrantLock分为公平锁和非公平锁,我们首先分析公平锁。
244226
intel的手册对lock前缀的说明如下:
245227

246228
1. 确保对内存的读-改-写操作原子执行。在Pentium及Pentium之前的处理器中,带有lock前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。
247-
229+
248230
2. 从Pentium 4,Intel Xeon及P6处理器开始,intel在原有总线锁的基础上做了一个很有意义的优化:如果要访问的内存区域(area of memory)在lock前缀指令执行期间已经在处理器内部的缓存中被锁定(即包含该内存区域的缓存行当前处于独占或以修改状态),并且该内存区域被完全包含在单个缓存行(cache line)中,那么处理器将直接执行该指令。
249231

250232
3. 由于在指令执行期间该缓存行会一直被锁定,其它处理器无法读/写该指令要访问的内存区域,因此能保证指令执行的原子性。这个操作过程叫做缓存锁定(cache locking),缓存锁定将大大降低lock前缀指令的执行开销,但是当多处理器之间的竞争程度很高或者指令访问的内存地址未对齐时,仍然会锁住总线。

docs/java/design-parttern/初探Java设计模式5:Spring涉及到的9种设计模式.md

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,8 @@
1010
* [享元模式](#享元模式)
1111
* [结构型模式总结](#结构型模式总结)
1212
* [参考文章](#参考文章)
13-
* [微信公众号](#微信公众号)
14-
* [Java技术江湖](#java技术江湖)
15-
* [个人公众号:黄小斜](#个人公众号:黄小斜)
1613

17-
18-
19-
20-
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
21-
22-
> https://github.com/h2pl/Java-Tutorial
23-
24-
喜欢的话麻烦点下Star、fork哈
25-
26-
文章也将发表在我的个人博客,阅读体验更佳:
27-
28-
> www.how2playlife.com
14+
2915

3016
**设计模式**作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。
3117

docs/java/jvm/深入了解JVM虚拟机8:Java的编译期优化与运行期优化.md

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,43 +12,11 @@
1212
* [编译优化技术](#编译优化技术)
1313
* [java与C/C++编译器对比](#java与cc编译器对比)
1414
* [参考文章](#参考文章)
15-
* [微信公众号](#微信公众号)
16-
* [Java技术江湖](#java技术江湖)
17-
* [个人公众号:黄小斜](#个人公众号:黄小斜)
18-
19-
20-
本文转自互联网,侵删
21-
22-
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
23-
> https://github.com/h2pl/Java-Tutorial
24-
25-
喜欢的话麻烦点下Star哈
26-
27-
文章将同步到我的个人博客:
28-
> www.how2playlife.com
29-
30-
本文是微信公众号【Java技术江湖】的《深入理解JVM虚拟机》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
31-
32-
该系列博文会告诉你如何从入门到进阶,一步步地学习JVM基础知识,并上手进行JVM调优实战,JVM是每一个Java工程师必须要学习和理解的知识点,你必须要掌握其实现原理,才能更完整地了解整个Java技术体系,形成自己的知识框架。
33-
34-
为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。
35-
36-
如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
37-
38-
<!-- more -->
39-
40-
41-
42-
43-
4415

16+
4517

4618
## [java编译期优化](https://www.cnblogs.com/LeonNew/p/6187411.html)
4719

48-
49-
50-
51-
5220
java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:
5321
1.前端编译:把_.java文件转变为_.class文件
5422
2.后端编译:把字节码转变为机器码

0 commit comments

Comments
 (0)