11---
2- ngtitle : 并发简介
2+ title : 并发简介
33date : 2018/05/21
44categories :
55- javase
@@ -10,23 +10,80 @@ tags:
1010
1111# 并发简介
1212
13- <!-- TOC depthFrom:2 depthTo:4 -->
13+ <!-- TOC -->
1414
15+ - [ 核心概念] ( #核心概念 )
16+ - [ 并发和并行] ( #并发和并行 )
17+ - [ 同步和异步] ( #同步和异步 )
18+ - [ 阻塞和非阻塞] ( #阻塞和非阻塞 )
19+ - [ 进程和线程] ( #进程和线程 )
1520- [ 多线程的优点] ( #多线程的优点 )
1621- [ 多线程的风险] ( #多线程的风险 )
1722 - [ 安全性问题] ( #安全性问题 )
18- - [ 线程不安全的示例] ( #线程不安全的示例 )
19- - [ 竞态条件和临界区] ( #竞态条件和临界区 )
2023 - [ 活跃性问题] ( #活跃性问题 )
21- - [ 死锁] ( #死锁 )
22- - [ 饥饿和公平] ( #饥饿和公平 )
2324 - [ 性能问题] ( #性能问题 )
24- - [ 上下文切换] ( #上下文切换 )
25- - [ 资源限制] ( #资源限制 )
2625- [ 资料] ( #资料 )
2726
2827<!-- /TOC -->
2928
29+ ## 核心概念
30+
31+ ### 并发和并行
32+
33+ * 例子
34+ * 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
35+ * 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
36+ * 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
37+ * 定义
38+ * ** 并发** 的关键是你有处理多个任务的能力,不一定要同时。
39+ * ** 并行** 的关键是你有同时处理多个任务的能力。
40+ * 最关键的点就是:是否是** 同时** 。
41+
42+ <p align =" center " >
43+ <img src =" https://raw.githubusercontent.com/dunwu/javase-notes/master/images/concurrent/concurrent-vs-parallel.jpg " alt =" concurrent-vs-parallel " >
44+ </p >
45+
46+ ### 同步和异步
47+
48+ * 例子
49+ * 同步就像是打电话,不挂电话,通话不会结束。
50+ * 异步就像是发短信,发完短信后,就可以做其他事,短信来了,手机会提醒。
51+ * 定义
52+ * 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
53+ * 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
54+
55+ <p align =" center " >
56+ <img src =" https://raw.githubusercontent.com/dunwu/javase-notes/master/images/concurrent/synchronous-vs-asynchronous.gif " alt =" synchronous-vs-asynchronous " >
57+ </p >
58+
59+ ### 阻塞和非阻塞
60+
61+ * 例子
62+ * 阻塞调用就像是打电话,通话不结束,不能放下。
63+ * 非阻塞调用就像是发短信,发完短信后,就可以做其他事,短信来了,手机会提醒。
64+ * 定义
65+ * 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
66+ * 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
67+ * 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
68+
69+ ### 进程和线程
70+
71+ * 什么是进程
72+ * 简言之,进程可视为一个正在运行的程序。
73+ * 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动。进程是操作系统进行资源分配的基本单位。
74+ * 什么是线程
75+ * 线程是操作系统进行调度的基本单位。
76+ * 进程 vs. 线程
77+ * 一个程序至少有一个进程,一个进程至少有一个线程。
78+ * 线程比进程划分更细,所以执行开销更小,并发性更高
79+ * 进程是一个实体,拥有独立的资源;而同一个进程中的多个线程共享进程的资源。
80+
81+ <p align =" center " >
82+ <img src =" https://raw.githubusercontent.com/dunwu/javase-notes/master/images/concurrent/processes-vs-threads.jpg " alt =" processes-vs-threads " >
83+ </p >
84+
85+ JVM 在单个进程中运行,JVM 中的线程共享属于该进程的堆。这就是为什么几个线程可以访问同一个对象。线程共享堆并拥有自己的堆栈空间。这是一个线程如何调用一个方法以及它的局部变量是如何保持线程安全的。但是堆不是线程安全的并且为了线程安全必须进行同步。
86+
3087## 多线程的优点
3188
3289* 更好的资源利用
@@ -189,4 +246,6 @@ Java 不可能实现 100% 的公平性,我们依然可以通过同步结构在
189246* http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html
190247* http://tutorials.jenkov.com/java-concurrency/deadlock.html
191248* http://tutorials.jenkov.com/java-concurrency/deadlock-prevention.html
192- * http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html
249+ * http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html
250+ * https://www.zhihu.com/question/33515481
251+ * https://blog.csdn.net/yaosiming2011/article/details/44280797
0 commit comments