文章目录
- 基础知识
- 什么是JUC
- 并发编程的优缺点
- 优点
- 缺点
- 阻塞与非阻塞
- 同步与异步
- 并发与并行
- 并发
- 并行
- 进程和线程
- 进程
- 线程
- 线程的状态
基础知识
什么是JUC
JUC就是 java.util.concurrent 下面的类包,专门用于多线程的开发。
并发编程的优缺点
优点
- 充分利用多核CPU的计算能力
多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。 - 方便进行业务拆分,提升系统并发能力和性能
现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。
缺点
- 频繁的上下文切换
任务从保存到再加载就是一次上下文切换,而每次切换时,需要保存当前的状态,以便能够进行恢复先前的状态,而这个切换时非常损耗性能,过于频繁反而无法发挥出多线程编程的优势 - 线程安全问题
多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用
阻塞与非阻塞
阻塞与非阻塞的重点在于 线程等待消息时候的行为 ,也就是在等待消息的时候,当前线程是挂起状态,还是非挂起状态。
- 阻塞:调用在发出去后,在消息返回之前,当前线程会被挂起,直到有消息返回,当前线程才会被激活
- 非阻塞:调用在发出去后,不会阻塞当前线程,而会立即返回
同步与异步
- 同步:当一个同步调用发出去后,调用者要一直等待调用结果的返回后,才能进行后续的操作
- 异步:当一个异步调用发出去后,调用者不用管被调用方法是否完成,都会继续执行后面的代码。 异步调用,要想获得结果,一般有两种方式:
- 主动轮询异步调用的结果
- 被调用方通过callback来通知调用方调用结果
并发与并行
并发
线程轮流使用cpu的做法称为并发
并行
多个cpu下,每个核都可以调度运行线程,这时候线程可以是并行的
进程和线程
进程
进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士)等
线程
- 一个进程之内可以分为一到多个线程。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行
- Java中,线程作为最小调度单位,进程作为资源分配的最小单位,在 windows中进程是不活动的,只是作为线程的容器
线程的状态
public enum State {
//运行
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待
WAITING,
//超时等待
TIMED_WAITING,
//终止
TERMINATED;
}
- 线程创建之后它将处于NEW(新建)状态
- 调用start()方法后开始运行,并且在线程获得了 CPU 时间片(timeslice)后就处于RUNNING(运行)状态
- 当线程调用 同步方法 时,在没有获取到锁的情况下,线程将会进入到BLOCKED(阻塞)状态
- 当线程执行wait()方法之后,线程进入WAITING(等待)状态
- 在 等待状态 的基础上增加了超时限制,比如通过sleep(long millis)方法或wait(long millis)方法可以将线程置于等待超时(TIMED WAITING)状态
- 线程运行完将会进入到TERMINATED(终止)状态