关于多线程:编程体系结构05Java多线程并发

6次阅读

共计 3192 个字符,预计需要花费 8 分钟才能阅读完成。

本文源码: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·点这里 ☆☆☆☆☆
正文完
 0