File tree Expand file tree Collapse file tree 1 file changed +3
-2
lines changed Expand file tree Collapse file tree 1 file changed +3
-2
lines changed Original file line number Diff line number Diff line change @@ -60,9 +60,10 @@ public class MultiThread {
60
60
下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。如果你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话可以阅读一下我的这篇文章:[ 《可能是把 Java 内存区域讲的最清楚的一篇文章》] (https://github.com/Snailclimb/JavaGuide/blob/master/Java 相关/可能是把 Java 内存区域讲的最清楚的一篇文章.md)
61
61
62
62
<div align =" center " >
63
- <img src =" https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3Java 运行时数据区域 JDK1 .8.png " width =" 600px " />
63
+ <img src =" https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3Java%E8%BF%90%E8%A1%8C%E6%97%B6%E6%95%B0%E6%8D%AE%E5%8C%BA%E5%9F%9FJDK1 .8.png " width =" 600px " />
64
64
</div >
65
65
66
+
66
67
从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的** 堆** 和** 方法区 (JDK1.8 之后的元空间)** 资源,但是每个线程有自己的** 程序计数器** 、** 虚拟机栈** 和 ** 本地方法栈** 。
67
68
68
69
下面来思考这样一个问题:为什么** 程序计数器** 、** 虚拟机栈** 和** 本地方法栈** 是线程私有的呢?为什么堆和方法区是线程共享的呢?
@@ -278,7 +279,7 @@ Linux 相比与其他操作系统(包括其他类 Unix 系统)有很多的
278
279
279
280
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。
280
281
281
- ![ 线程死锁示意图 ] (https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3 死锁 1 .png)
282
+ ![ 线程死锁示意图 ] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-4/2019-4死锁1 .png )
282
283
283
284
下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况 (代码来源于《并发编程之美》):
284
285
You can’t perform that action at this time.
0 commit comments