File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
221221
222222[ 操作系统学习总结] ( docs/operating-system/操作系统学习总结.md )
223223
224+ [ 操作系统复习] ( docs/operating-system/操作系统复习.md )
225+
224226#### Linux相关
225227
226228[ Linux内核与基础命令学习总结] ( docs/operating-system/Linux内核与基础命令学习总结.md )
287289
288290### Kafka
289291
292+ Todo
293+
290294## 大后端
291295
292296* [ 后端技术杂谈开篇:云计算,大数据与AI的故事] ( docs/big-backEnd/后端技术杂谈开篇:云计算,大数据与AI的故事.md )
Original file line number Diff line number Diff 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
184181public class QuickSort implements IArraySort {
@@ -430,4 +427,3 @@ ListNode deleteDuplicates(ListNode head) {
430427 return head;
431428}
432429```
433-
Load Diff This file was deleted.
Original file line number Diff line number Diff line change 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## 前言
3918AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理。
4019
Original file line number Diff line number Diff line change 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
226226class 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
Original file line number Diff line number Diff line change 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
119101 }
120102 }
121103 }
122-
104+
123105在ReentrantLock中,调用lock()方法获取锁;调用unlock()方法释放锁。
124106
125107ReentrantLock的实现依赖于java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,马上我们会看到,这个volatile变量是ReentrantLock内存语义实现的关键。 下面是ReentrantLock的类图(仅画出与本文相关的部分):
@@ -244,7 +226,7 @@ ReentrantLock分为公平锁和非公平锁,我们首先分析公平锁。
244226intel的手册对lock前缀的说明如下:
245227
2462281 . 确保对内存的读-改-写操作原子执行。在Pentium及Pentium之前的处理器中,带有lock前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。
247-
229+
2482302 . 从Pentium 4,Intel Xeon及P6处理器开始,intel在原有总线锁的基础上做了一个很有意义的优化:如果要访问的内存区域(area of memory)在lock前缀指令执行期间已经在处理器内部的缓存中被锁定(即包含该内存区域的缓存行当前处于独占或以修改状态),并且该内存区域被完全包含在单个缓存行(cache line)中,那么处理器将直接执行该指令。
249231
2502323 . 由于在指令执行期间该缓存行会一直被锁定,其它处理器无法读/写该指令要访问的内存区域,因此能保证指令执行的原子性。这个操作过程叫做缓存锁定(cache locking),缓存锁定将大大降低lock前缀指令的执行开销,但是当多处理器之间的竞争程度很高或者指令访问的内存地址未对齐时,仍然会锁住总线。
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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-
5220java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:
53211.前端编译:把_ .java文件转变为_ .class文件
54222.后端编译:把字节码转变为机器码
You can’t perform that action at this time.
0 commit comments