资源,作业,任务
进程,线程,协程
串行,并行,并发
同步,异步
锁
关键字
线程安全类
资源分类:互斥资源(一次只能1个进程/线程/协程使用),抢占式资源(可以被抢占,CPU),消耗型资源(资源有限个)
作业:由程序员书写的静态过程,进程讲作业
任务:由程序员书写的静态过程,线程讲任务
- 进程和作业对应,程序员书写作业,进程负责执行作业
- 线程和任务对应,程序员书写任务,线程负责执行任务
- 作业讲串行或并行
- 任务讲串行或并行
- 并发是伪并行
- 多进程讲同步或异步
- 多线程讲同步或异步
- 多协程讲同步或异步
- 单线程执行效率高,还是多线程执行效率高
- 5个以上线程时使用线程池管理线程
- 读操作多的情况下使用乐观锁
- 写操作多的情况下使用悲观锁,决定使用悲观锁时优先使用读写锁
直接制约:进程同步,进程之间有执行顺序
间接制约:互斥资源
- 同步:线程之间有制约关系
- 异步:线程之间无制约关系
- 任务各种执行顺序
- 串行:任务之间具有某种关系
- 并行:任务之间没有任何关系
进程是资源拥有者:每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
进程特点
进程状态
进程同步
进程通信
进程中断
经典同步问题:资源、进程、信号量
死锁产生的必要条件
动态,并发,独立,异步
进程/状态就绪、运行、阻塞、挂起
进程/同步同步机制
- 信号量机制
- 管程机制,就是搞个秘书,每次只允许一个进程访问资源
经典同步问题
- 生产者-消费者
- 读写者优先
- 哲学家进餐
- 理发师问题
共享数据结构:例如,生产者消费者中的有界缓冲区
共享存储区:需要通信的进程将共享存储区中的一个分区附加到自己的地址空间
消息系统:操作系统提供的通信命令在进程间传递格式化的消息
管道机制:pipe文件连接读写进程
C/S系统:不同计算机的进程间通信
停止当前任务》执行新任务》回到原来任务继续执行
线程线程数量:1个程序至少有1个进程,1个进程至少有1个线程
并行并发:多线程程序在单核上运行,是并发;多线程程序在多核上运行,是并行
内存共享:各个线程之间共享程序的内存空间(也就是所在进程的内存空间)
线程分类:内核线程、用户线程;内核线程和用户线程间有 多对多、一对一、多对1的关系
内核线程:一般一个CPU物理核心对应一个内核线程,使用超线程技术后出现“4核8线程”
内核线程:内核级线程是由操作系统进行调度的,用户级线程是由用户来控制调度的
java中线程分类:User Thread(用户线程)、Daemon Thread(守护线程)
非守护线程结束,所有守护线程全部杀死
原子性
- 防止中断,被别的命令插队
- 全荣俱荣,一损俱损
- 单线程,单条指令具有原子性
- 多线程,不被其他线程中断的一组指令具有原子性
有序性
- 这条指令之前的指令都都被执行,之后的指令都没有执行。
可见性
- 主存中数据的改变在线程栈中可见
- 线程栈中一份数据,主存中一份数据
就绪、运行、阻塞、挂起
线程/同步 线程/通信共享数据结构
- 同步锁:synchronized关键字这种方式;共享的数据结构是字节码
- while轮询的方式:不同线程共用条件;共享的数据结构是某个变量(变量存在volatile内存可见性问题)
消息系统:
- wait/notify机制:存在过早通知的问题,只通知一次过早通知的问题
管道通信:
- java.io.PipedInputStream 和 java.io.PipedOutputStream
interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
不应该强制中断,应该由线程自行停止
中断响应方式:运行状态自行中断,selfInterrupt();阻塞状态直接抛出异常,throw new InterruptedException()
中断最终都是抛出InterruptedException
适用:高并发,多IO场景。不适用于大量计算的场景,大量计算的场景用多线程更好
- 轻量:协程默认栈大小1k,线程的默认栈大小1M,一个线程可以拥有多个协程
- 高效:减少线程上下文切换(线程上下文切换由系统负责,协程切换由用户负责),避免线程状态切换(线程让出当前的协程,开启新的协程执行任务)
- 安全:只有一个线程,不存在争抢资源情况
普通锁(synchronized), 乐观锁(CAS), AQS(AbstractQueuedSynchronizer), 悲观锁
使用时机:
- 大多数情况使用普通锁(synchronized)即可,JVM对普通锁(synchronized)有很多优化
- 读操作多的情况下使用乐观锁
- 写操作多的情况下使用悲观锁,决定使用悲观锁时优先使用读写锁
乐观锁(CAS):compare and swap
悲观锁:
- ReentrantLock 可重入锁
- Semaphore 信号量锁
- CountDownLatch 闭锁
- CyclicBarrier 循环栅栏锁
synchronized
volatile
集合:Vector, StringBuffer, HashTable, ConcurrentHashmap, CopyOnWriteArraySet
原子类:AtomicInteger, LongAdder(java8), DoubleAdder(java8)
阻塞队列:LinkedBlockingQueue(无界队列), SynchronousQueue(同步队列), DelayedWorkQueue(延迟队列)



