Java并发编程的“基石”——多线程概念初识
课程链接:链接
第1章 踏上Java并发征途
1-1 课程概览
-
晦涩难懂的概念:
- 线程、进程
- 串行、并行、并发
- 多线程、高并发
- 同步异步、阻塞非阻塞
-
问题
- 线程和进程有什么不同?
- 并行和并发有什么区别?
- 多线程是不是就是高并发?
- 同步阻塞 和 异步非阻塞 的关系?
1-2 从思维导图看并发脉络
第2章 孪生兄弟:进程和线程
2-1 什么是进程?实操案例:用活动监视器看正在运行的各进程
-
操作系统是包含多个进程的容器,而每个进程又都是容纳多个线程的容器
-
进程:是程序(这里可以理解为我们写的代码)的真正运行实例,是资源分配的基本单位。
2-2 什么是线程?实操案例:用代码演示线程数量的实时变化
- 线程:是CPU的基本调度单位,每个线程执行的都是进程代码的某个片段。
/**
* Date: 2020/3/12 10:43
* Content: 创建100个进程,用活动监视器的CPU栏目看JAVA线程数量的变化,10秒后线程消失
*/
public class Create100Threads {
public static void main(String[] args) {
for (int i = 0; i < 100; i++){
new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(5000);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
}
}
2-3 线程和进程有哪6个不同?生活用例:房子与住户
-
起源不同
- 先有进程,后有线程(线程的出现目的是提高CPU的利用效率)
-
概念不同
- 进程:是程序(这里可以理解为我们写的代码)的真正运行实例,是资源分配的基本单位。
- 线程:是CPU的基本调度单位。
-
内存共享方式不同
- 不同进程间的内存通常是不共享的,除非使用进程间通信IPC
- 两个线程之间通信起来很容易
-
拥有的资源不同
扫描二维码关注公众号,回复: 12570824 查看本文章-
线程资源少于进程资源
-
线程之间共享的内容包括:
- 1.进程代码段
- 2.进程的共有数据(利用这些共享的数据,线程很容易实现相互的通讯)
- 3.进程打开的文件描述符
- 4.信号的处理器
- 5.进程的当前目录
- 6.进程用户ID与进程组ID
-
线程之间独有的内容包括:
- 1.线程ID
- 2.寄存器组的值
- 3.线程的堆栈
- 4.错误返回码
- 5.线程的信号屏蔽码
-
-
数量不同
- 一个进程可以对应多个线程
-
开销不同
- 线程的创建、终止时间比进程段
- 同一进程内的线程切换时间比进程之间切换时间短
- 同一进程内的线程共享内存和文件资源,可以不通过内核进行通信
- 相似点:生命周期
2-4 Java和多线程的渊源-代码演示JVM自启动线程,分析它们的作用
/**
* Date: 2020/3/12 11:16
* Content: 即使代码中不显示创建线程,在运行main时,JVM也会自动启动其他的线程
*/
public class JavaAndThreads {
public static void main(String[] args) {
System.out.println("Hello Threads!");
}
}
- main 主线程,用户程序的入口
- Finalizer 负责对象的finalize()方法
- Reference Handler 和GC、引用相关的线程
- Signal Dispatcher 把操作系统发来的信号分发给适当的程序
第3章 多线程比线程复杂在哪里?
3-1 什么是多线程?生活案例:”合租室友“和”吃火锅“
- 多线程:如果一个程序允许运行两个或以上的线程,那么它就是多线程程序。多线程是指单个进程中运行多个线程。
3-2 为什么需要多线程?3大原因
- 最主要目的:提高CPU利用率
-
提高处理速度
-
避免无效等待(IO的时候可以做别的事)
-
提高用户体验:避免卡顿、缩短等待时间
- 并行处理,提高性能,通常是服务器领域(例如Tomcat),用多个线程去接收HTTP请求,而不是排队等待单一的线程处理
- 在Android开发中,主线程的重要任务之一是绘制屏幕界面,该线程中不允许进行IO操作或者网络请求,目的就是避免卡顿,影响用户的交互
-
便于编程建模
-
性能定律:摩尔定律失效,阿姆达尔定律上场
3-3 什么场景需要多线程?有哪些局限?
- 什么场景需要多线程?
- 为了同时做多件不同的事:(1)开网页同时听音乐(2)后台定时任务
- 为了提高工作效率、处理能力:(1)tomcat(2)并行下载(3)NIO
- 需要同时有很大并发量的时候:压测
- 有哪些局限?
- 性能问题:上下文切换带来的消耗
- 异构化任务(任务结构不一样)很难高效并行
- 带来线程安全问题:包括数据安全问题(例如i++总数不一致)以及线程带来的活跃性问题(线程饥饿、死锁)。
第4章 并行和并发傻傻分不清楚?
4-1并行和并发傻傻分不清楚?一图胜千言
-
并行:真正地“同时”运行------在同一个时刻,有多个任务同时执行
- 例如,在多核处理器上,有两个线程同时执行同一段代码。
- 可见,单核处理器是无法实现并行的,因为单核处理器无法在同一时刻执行多个任务。
-
并发:有两种概念:(1)形容多个任务的执行状态(2)对“并发性”的简称
- (1)形容多个任务的执行状态
- 两个或多个任务可以在重叠的时间段内启动,运行和完成
- 并行(两个或多个任务同时执行)一定是并发
- (2)对“并发性”的简称
- 不同的部分可以无序或同时执行,且不影响最终的执行结果
- (1)形容多个任务的执行状态
4-2 是什么让并发和并行成为了可能?
- CPU升级
- 操作系统升级
- 编程语言升级
第5章 高并发只是并发的升级版吗?
5-1 什么是高并发?企业案例:双11、春晚
- 高并发:同时有很多请求发送给服务器系统,服务器进行并行处理
5-2 高并发和多线程的关系?相互成就
-
高并发 是一种 状态,多线程 是一种解决方案
多线程是我们解决 高并发这个问题 的一种解决方案
-
高并发 并不意味着是 多线程:Redis
5-3 高并发有哪些重要指标?
-
QPS(Queries Per Second):每秒钟查询数,又是也延伸为每秒钟请求数
-
带宽
-
PV(Page View):24小时的页面访问(点击)量
-
UV(Unique Visitor):24小时的访问的用户量
IP和UV的区别:比如断线重连,IP变了,但cookie未变,多个IP对应一个UV;同一局域网中对外只有一个IP,但局域网内不同设备cookie不一样,多个UV对应一个IP
-
并发连接数(The number of concurrent connections)
-
服务器平均请求等待时间(Time per request:across all concurrent requests)
第6章 你真的懂同步与异步?阻塞与非阻塞?
6-1 一图胜千言:同步、异步是什么含义?
-
同步异步是指被调用者(也就是服务器)的行为,而不是请求方的行为。
-
同步:在没有得到结果之前,服务端就不返回任何结果。
-
异步:调用发出之后,服务端会立刻返回,告诉调用方“我收到你的请求了,我会处理的”。
一个例子:最原始的方式烧水,我们需要不停的查看水是否开了—>同步
用现在的水壶烧水,直接上电等到水开水壶会响—>异步
6-2 4中组合:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞
-
阻塞非阻塞是站在线程状态(线程发出请求(通常是HTTP请求))的角度
-
阻塞:线程发出请求后只能等待,不能处理其他任何内容
-
非阻塞:线程发出请求后只能等待,能处理其他内容
堵塞 | 非堵塞 | |
---|---|---|
同步 | 同步堵塞 | 同步非堵塞 |
异步 | 异步堵塞 | 异步非堵塞 |
还是6-1烧水的例子:
同步阻塞:我们需要检查水是否开了(同步),我们只能等待(阻塞)
同步非阻塞:我们需要检查水是否开了(同步),我们可以去做其他事情,比如看电视,每隔三分钟检查一次水是否开了(非阻塞)
异步阻塞:水开之后会提醒我们(异步),我们只能等待(阻塞)
异步非阻塞:水开之后会提醒我们(异步),我们可以去做其他事情(非阻塞)
第7章 面试问题检验学习成果
7-1 常见面试问题
- 进程 和 线程 的相同和不同?
- 并行 和 并发 的异同?
- 高并发 是不是就意味着 多线程?有什么反例?
- 多线程可以提高程序执行效率,你知不知到有哪些弊端?
- 什么是同步,什么是异步,什么是阻塞,什么是非阻塞?
- 在单核CPU上运行多线程程序有意义吗?