• 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(延迟队列)

  • 相关阅读:
    记录一次内网渗透过程
    虫情测报灯如何实现自动化测报?
    [Ubuntu18.10] 给docker容器加上gpu加速
    Vue研习录(04)——列表渲染讲解及示例分析
    混凝土板材及砌块生产线数字孪生可视化管理系统,实现智慧工厂车间智能化数字化管理
    基于springboot的公交线路查询系统设计与实现
    【Ansible】Ansible常用模块
    MySql 实现递归with recursive
    聚观早报 | SpaceX 再获 2.5 亿美元融资;Meta推迟决定实习生转正
    CSS选择器分类 [后代选择器、交集选择器、并集选择器(分组选择器)]
  • 原文地址:https://blog.csdn.net/baidu_35805755/article/details/122144039