这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。
并发笔记
线程概述
- 进程:
- 进程是计算机中程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位
- 操作系统中正在运行的一个程序
- 线程:
- 线程是进程的一个执行单元
- 一个线程就是进程中一个单一顺序的控制流,进程的一个执行分支
- 进程是线程的容器,一个进程至少有一个线程,也可以有多个线程
- 在操作系统中是以进程为单位分配资源,每一个线程都有自己的线程栈,寄存器环境,自己的线程本地存储
- 主线程与子线程
- JVM在启动的时候会创建一个主线程,该主线程负责执行main方法,主线程就是运行main方法的线程
- java中的线程不是孤立的,线程之间存在一些联系,如果A线程中创建了B线程,那么称B线程是A线程的子线程,A就是B线程的父线程
二者对比
- 进程基本上相互独立,而线程存在于进程内,是进程的一个子集
- 进程拥有共享的资源,如内存空间等,供其内部的线程共享
- 进程间通信较为复杂
- 同一台计算机的进程通信称为IPC
- 不同计算机之间的进程通信需要通过网络,共同遵守共同的协议,如HTTP
- 线程通信相对简单, 因为他们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
- 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低
并发和并行
单核cpu下,线程实际上是串行执行的,操作系统中有一个组件叫做任务调度器,将cpu时间片分给不同的线程使用,只是由于cpu在线程间(时间片很短)的切换非常快,人类感觉是同时运行的 一半将这种线程轮流使用cpu的做法称为并发,concurrent
多核cpu下,每个核都可以调度运行线程,这时候线程可以是并行的
- 并发(concurrent)是同一时间应对多件事情的能力
- 并行(parallel)是同一时间动手做多件事情的能力
应用
从方法调用的角度来看
- 需要等待结果返回,才能继续运行的就是同步
- 不需要等待结果的返回,就能继续运行的是异步 注意: 同步在多线程中还有另外一层意思,就是让多个线程步调一致
并发之共享模型
- 管程-悲观锁(阻塞)
- JVM
- 原子性
- 可见性
- 有序性
- 无锁-乐观锁(非阻塞)
- 不可变
- 并发工具
- 线程池
- J.U.C
- Lock
- Semaphore
- CountdownLatch
- CyclicBarrier
- CncurrentHashMap
- BlockingQueue
- CopyOnWriteArrayList
- disruptor
- guava
- 异步编程
- CompleableFuture
- 反应式
-
project-reactor
-
spring webflux
-
并发之非共享模型
- 私有
- Actor -弱一致性
- akka
并行
- 函数式编程
- 并行编程
- 映射
- 归约