本文源码:GitHub·点这里 || GitEE·点这里
一、多线程导图
二、多线程根底
1、根底概念
线程是操作系统可能进行运算调度的最小单位,蕴含在过程之中,是过程中的理论运作单位。一条线程指的是过程中一个繁多程序的控制流,一个过程中能够并发多个线程,每条线程并行执行不同的工作。
2、创立形式
继承 Thread 类、实现 Runnable 接口、基于 Callable 和 Future 接口、Timer 是后盾线程、线程池。
3、线程状态
状态形容:初始状态、运行状态、阻塞状态、期待状态、超时期待状态、终止状态。
4、执行机制
JVM 中一个利用是能够有多个线程并行执行,线程被一对一映射为服务所在操作系统线程,调度在可用的 CPU 上执行,启动时会创立一个操作系统线程;当该线程终止时,这个操作系统线程也会被回收。
5、内存模型
在虚拟机启动运行时,会创立多个线程,数据区中有的模块是线程共享的,有的是线程公有的:
线程共享:元数据区、堆 Heap;
线程公有:虚拟机栈、本地办法栈、程序计数器;
单个 CPU 在特定时刻只能执行一个线程,所以多线程通过几块空间的应用,而后一直的争抢 CPU 的执行时间段。
三、常见概念
1、线程优先级
线程调度器偏向执行线程优先级高的线程,线程优先级高阐明获取 CPU 资源的概率高,或者获取的执行工夫分片多,被执行的概率高但不代表优先级低的肯定最初执行。
2、守护线程
守护线程是反对辅助型线程,次要在程序中起到调度和支持性作用,当 Jvm 中非守护线程全副完结,守护线程也就会完结。
3、线程退出
线程 A 中,执行线程 B 的退出办法,那么 A 线程就会期待线程 B 执行结束再返回继续执行。
4、本地线程
ThreadLocal 也叫做线程本地变量,为变量在每个线程中的创立正本,每个线程能够拜访本人外部的正本变量,线程之间互不相互影响。
四、线程平安
在上图线程与内存空间的占用形式看,在线程拜访共享内存块时,保障线程平安就很有必要。
1、同步控制
Synchronized 关键字同步控制,能够润饰办法,润饰代码块,润饰静态方法等,同步控制的资源少,能够进步多线程效率。
2、加锁机制
Lock 接口:Java 并发编程中资源加锁的根接口之一,规定了资源锁应用的几个根底办法。
ReentrantLock 类:实现 Lock 接口的可重入锁,即线程如果取得以后实例的锁,并进入工作办法,在线程没有开释锁的状态下,能够再次进入工作办法,特点:互斥排它性,即同一个时刻只有一个线程进入工作。
Condition 接口:形容可能会与锁有关联的条件变量,提供了更弱小的性能,例如在线程的期待 / 告诉机制上,Conditon 能够实现多路告诉和选择性告诉。
3、Volatile 关键字
volatile 润饰成员变量,不能润饰办法,即标识该线程在拜访这个变量时须要从共享内存中获取,对该变量的批改,也须要同步刷新到共享内存中,保障了变量对所有线程的可见性。
五、线程通信
线程是个独立的个体,然而在线程执行过程中,如果解决同一个业务逻辑,可能会产生资源争抢,导致并发问题,甚至死锁景象,线程之间协调工作,就须要通信机制来保障。
1、根底办法
相干办法是 Java 中 Object 层级的根底办法,任何对象都有该办法:notify() 随机告诉一个在该对象上期待的线程,使其完结 wait 状态返回;wait() 线程进入 waiting 期待状态,不会争抢锁对象,也能够设置等待时间;
2、期待 / 告诉机制
期待 / 告诉机制,该模式下指线程 A 在不满足工作执行的状况下调用对象 wait() 办法进入期待状态,线程 B 批改了线程 A 的执行条件,并调用对象 notify() 或者 notifyAll() 办法,线程 A 收到告诉后从 wait 状态返回,进而执行后续操作。两个线程通过基于对象提供的 wait()/notify()/notifyAll() 等办法实现期待和告诉间交互,进步程序的可伸缩性。
3、管道流通信
管道流次要用于在不同线程间间接传送数据,一个线程发送数据到输入管道,另一个线程从输出管道中读取数据,进而实现不同线程间的通信。
六、线程池
1、Executor 接口
Executor 零碎中,将线程工作提交和工作执行进行理解耦的设计,Executor 有各种功能强大的实现类,提供便捷形式来提交工作并且获取工作执行后果,封装了工作执行的过程,不再须要 Thread().start() 形式,显式创立线程并关联执行工作。
2、外围参数
3、相干 API 类
线程池工作:外围接口:Runnable、Callable 接口和接口实现类;
工作的后果:接口 Future 和实现类 FutureTask;
工作的执行:外围接口 Executor 和 ExecutorService 接口。在 Executor 框架中有两个外围类实现了 ExecutorService 接口,ThreadPoolExecutor 和 ScheduledThreadPoolExecutor。
七、罕用线程 API
1、Fork/Join 机制
Fork/Join 框架用于并行执行工作,外围的思维就是将一个大工作切分成多个小工作,而后汇总每个小工作的执行后果失去这个大工作的最终后果。外围流程:切分工作,模块工作异步执行,单任务后果合并。
2、容器类
ConcurrentHashMap:应用分段锁机制,把容器中数据分成一段一段的形式存储,而后给每一段数据配一把锁,当一个线程占用锁拜访其中一个段数据的时候,其余段的数据也能被其余线程拜访,即思考安全性也顾及执行效率。
ConcurrentLinkedQueue:基于链接节点的无界限程平安队列,依照 FIFO 先进先出准则对元素进行排序,队列的头部 是队列中工夫最长的元素,队列的尾部是队列中工夫最短的元素,新的元素增加到队列的尾部,获取元素操作从队列头部失去。
3、原子类
JDK 自带原子操作类,解决多个线程同时操作一个变量的状况,其中包含:根本类型、数组类型、援用类型、属性批改类型。
八、利用场景
1、定时工作
通过配置设置一些程序在指定工夫点,或者周期时间内法则循环执行,这里工作的执行就是基于多线程技术。
2、异步解决
异步解决就是不依照以后同步代码块程序执行,异步解决与同步解决是对抗的,异步的实现也须要多线程或者多过程,进步程序效率。
3、工作合成
分布式数据库中常见操作,数据分布在不同的数据库的正本中,在执行查问时,每个服务都要跑查问工作,最初在一个服务上做数据合并,或者提供一个两头引擎层,用来汇总数据,在大型的定时工作中,常常把要解决的工作依照特定策略分片,多个线程同时解决。
4、连接池技术
创立和治理一个连贯的缓冲池的技术,这些连贯筹备好被任何须要它们的线程应用,缩小连接不断创立和开释的问题,进步程序效率。
九、源代码地址
GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile
举荐浏览:编程体系整顿
序号 | 项目名称 | GitHub 地址 | GitEE 地址 | 举荐指数 | |
---|---|---|---|---|---|
01 | Java 形容设计模式, 算法, 数据结构 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | |
02 | Java 根底、并发、面向对象、Web 开发 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ | |
03 | SpringCloud 微服务根底组件案例详解 | GitHub·点这里 | GitEE·点这里 | ☆☆☆ | |
04 | SpringCloud 微服务架构实战综合案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | |
05 | SpringBoot 框架根底利用入门到进阶 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ | |
06 | SpringBoot 框架整合开发罕用中间件 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | |
07 | 数据管理、分布式、架构设计根底案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ | |
08 | 大数据系列、存储、组件、计算等框架 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |