9393
9494> 如果你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话可以阅读一下这篇文章:[ 《可能是把 Java 内存区域讲的最清楚的一篇文章》] ( < [https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F](https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java内存区域) > )
9595
96- ![ jvm运行时数据区域] ( https://images.xiaozhuanlan. com/photo/2019 /ff96fed0e2a354bb16bbc84dcedf503a.png )
96+ ![ jvm运行时数据区域] ( https://guide-blog- images.oss-cn-shenzhen.aliyuncs. com/2020-8 /ff96fed0e2a354bb16bbc84dcedf503a.png )
9797
9898从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的** 堆** 和** 方法区 (JDK1.8 之后的元空间)** 资源,但是每个线程有自己的** 程序计数器** 、** 虚拟机栈** 和 ** 本地方法栈** 。
9999
@@ -301,7 +301,7 @@ public class Singleton {
301301
302302为了更好地理解,我画了一个简单的CPU Cache示意图如下(实际上,现代的CPU Cache通常分为三层,分别叫L1,L2,L3 Cache):
303303
304- ![ CPU Cache] ( https://imgkr. cn-bj.ufileos .com/303a300f-70dd-4ee1-9974-3f33affc6574.png )
304+ ![ CPU Cache] ( https://guide-blog-images.oss- cn-shenzhen.aliyuncs .com/2020-8 /303a300f-70dd-4ee1-9974-3f33affc6574.png )
305305
306306** CPU Cache的工作方式:**
307307
@@ -313,13 +313,13 @@ public class Singleton {
313313
314314在 JDK1.2 之前,Java 的内存模型实现总是从** 主存** (即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存** 本地内存** (比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成** 数据的不一致** 。
315315
316- ![ JMM(Java内存模型)] ( https://imgkr. cn-bj.ufileos .com/0ac7e663-7db8-4b95-8d8e-7d2b179f67e8.png )
316+ ![ JMM(Java内存模型)] ( https://guide-blog-images.oss- cn-shenzhen.aliyuncs .com/2020-8 /0ac7e663-7db8-4b95-8d8e-7d2b179f67e8.png )
317317
318318要解决这个问题,就需要把变量声明为** volatile** ,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。
319319
320320所以,** volatile 关键字 除了防止 JVM 的指令重排 ,还有一个重要的作用就是保证变量的可见性。**
321321
322- ![ volatile关键字的可见性] ( https://imgkr. cn-bj.ufileos .com/d49c5557-140b-4abf-adad-8aac3c9036cf.png )
322+ ![ volatile关键字的可见性] ( https://guide-blog-images.oss- cn-shenzhen.aliyuncs .com/2020-8 /d49c5557-140b-4abf-adad-8aac3c9036cf.png )
323323
324324#### synchronized关键字介绍
325325
@@ -477,7 +477,7 @@ CompletableFuture<Void> allFutures = CompletableFuture.allOf(
477477
478478🙋 ** 我** :TCP 粘包/拆包 就是你基于 TCP 发送数据的时候,出现了多个字符串“粘”在了一起或者一个字符串被“拆”开的问题。比如你多次发送:“你好,你真帅啊!哥哥!”,但是客户端接收到的可能是下面这样的:
479479
480- ![ ] ( https://imgkr. cn-bj.ufileos .com/07bd8979-2b34-4000-a829-03a74d0701b2.png )
480+ ![ ] ( https://guide-blog-images.oss- cn-shenzhen.aliyuncs .com/2020-8 /07bd8979-2b34-4000-a829-03a74d0701b2.png )
481481
482482** 解决办法:**
483483
@@ -538,7 +538,7 @@ try {
538538 // ......
539539```
540540
541- ! [](https: // imgkr. cn-bj.ufileos .com/7e7357ef-e724-4122-847c-fbccd9eb6ae3.png)
541+ ! [](https: // guide-blog-images.oss- cn-shenzhen.aliyuncs .com/2020-8/ 7e7357ef-e724-4122-847c-fbccd9eb6ae3-20200802233344081 .png)
542542
543543** 3. 主从多线程模型**
544544
@@ -556,7 +556,7 @@ try {
556556 // ......
557557```
558558
559- ! [](https: // imgkr. cn-bj.ufileos .com/04d0a911-a5c1-4c18-947e-d14b80634510.png)
559+ ! [](https: // guide-blog-images.oss- cn-shenzhen.aliyuncs .com/2020-8/ 04d0a911-a5c1-4c18-947e-d14b80634510-20200802233346929 .png)
560560
561561#### Netty 的零拷贝
562562
0 commit comments