栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java多线程/总述

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java多线程/总述

总述

资源,作业,任务
进程,线程,协程
串行,并行,并发
同步,异步
锁
关键字
线程安全类

资源-作业-任务

资源分类:互斥资源(一次只能1个进程/线程/协程使用),抢占式资源(可以被抢占,CPU),消耗型资源(资源有限个)
作业:由程序员书写的静态过程,进程讲作业
任务:由程序员书写的静态过程,线程讲任务

进程-线程-协程
  • 进程和作业对应,程序员书写作业,进程负责执行作业
  • 线程和任务对应,程序员书写任务,线程负责执行任务
串行-并行|同步-异步
  • 作业讲串行或并行
  • 任务讲串行或并行
  • 并发是伪并行
  • 多进程讲同步或异步
  • 多线程讲同步或异步
  • 多协程讲同步或异步
多线程使用时机
  • 单线程执行效率高,还是多线程执行效率高
  • 5个以上线程时使用线程池管理线程
  • 读操作多的情况下使用乐观锁
  • 写操作多的情况下使用悲观锁,决定使用悲观锁时优先使用读写锁
进程之间关系

直接制约:进程同步,进程之间有执行顺序
间接制约:互斥资源

线程之间关系
  • 同步:线程之间有制约关系
  • 异步:线程之间无制约关系
任务之间关系
  • 任务各种执行顺序
  • 串行:任务之间具有某种关系
  • 并行:任务之间没有任何关系
进程

进程是资源拥有者:每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
进程特点
进程状态
进程同步
进程通信
进程中断
经典同步问题:资源、进程、信号量
死锁产生的必要条件

进程/特点

动态,并发,独立,异步

进程/状态

就绪、运行、阻塞、挂起

进程/同步

同步机制

  • 信号量机制
  • 管程机制,就是搞个秘书,每次只允许一个进程访问资源

经典同步问题

  • 生产者-消费者
  • 读写者优先
  • 哲学家进餐
  • 理发师问题
进程/通信

共享数据结构:例如,生产者消费者中的有界缓冲区
共享存储区:需要通信的进程将共享存储区中的一个分区附加到自己的地址空间
消息系统:操作系统提供的通信命令在进程间传递格式化的消息
管道机制:pipe文件连接读写进程
C/S系统:不同计算机的进程间通信

进程/中断

停止当前任务》执行新任务》回到原来任务继续执行

线程

线程数量:1个程序至少有1个进程,1个进程至少有1个线程
并行并发:多线程程序在单核上运行,是并发;多线程程序在多核上运行,是并行
内存共享:各个线程之间共享程序的内存空间(也就是所在进程的内存空间)
线程分类:内核线程、用户线程;内核线程和用户线程间有 多对多、一对一、多对1的关系
内核线程:一般一个CPU物理核心对应一个内核线程,使用超线程技术后出现“4核8线程”
内核线程:内核级线程是由操作系统进行调度的,用户级线程是由用户来控制调度的

线程分类

java中线程分类:User Thread(用户线程)、Daemon Thread(守护线程)
非守护线程结束,所有守护线程全部杀死

线程/3性

原子性

  • 防止中断,被别的命令插队
  • 全荣俱荣,一损俱损
  • 单线程,单条指令具有原子性
  • 多线程,不被其他线程中断的一组指令具有原子性

有序性

  • 这条指令之前的指令都都被执行,之后的指令都没有执行。

可见性

  • 主存中数据的改变在线程栈中可见
  • 线程栈中一份数据,主存中一份数据
线程/状态

就绪、运行、阻塞、挂起

线程/同步 线程/通信

共享数据结构

  • 同步锁: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(延迟队列)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号