• 深入了解JUC并发(一)什么是JUC


    基础知识

    什么是JUC

    JUC就是 java.util.concurrent 下面的类包,专门用于多线程的开发。

    并发编程的优缺点

    优点

    1. 充分利用多核CPU的计算能力

      多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。

    2. 方便进行业务拆分,提升系统并发能力和性能

      现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。

    缺点

    1. 频繁的上下文切换

      任务从保存到再加载就是一次上下文切换,而每次切换时,需要保存当前的状态,以便能够进行恢复先前的状态,而这个切换时非常损耗性能,过于频繁反而无法发挥出多线程编程的优势

    2. 线程安全问题

      多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用

    阻塞与非阻塞

    阻塞与非阻塞的重点在于 线程等待消息时候的行为 ,也就是在等待消息的时候,当前线程是挂起状态,还是非挂起状态。

    • 阻塞:调用在发出去后,在消息返回之前,当前线程会被挂起,直到有消息返回,当前线程才会被激活
    • 非阻塞:调用在发出去后,不会阻塞当前线程,而会立即返回

    同步与异步

    • 同步:当一个同步调用发出去后,调用者要一直等待调用结果的返回后,才能进行后续的操作
    • 异步:当一个异步调用发出去后,调用者不用管被调用方法是否完成,都会继续执行后面的代码。 异步调用,要想获得结果,一般有两种方式:
      1. 主动轮询异步调用的结果
      2. 被调用方通过callback来通知调用方调用结果

    并发与并行

    并发

    线程轮流使用cpu的做法称为并发

    在这里插入图片描述

    并行

    多个cpu下,每个核都可以调度运行线程,这时候线程可以是并行的

    进程和线程

    进程

    进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士)等

    线程

    1. 一个进程之内可以分为一到多个线程。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行
    2. Java中,线程作为最小调度单位,进程作为资源分配的最小单位,在 windows中进程是不活动的,只是作为线程的容器

    线程的状态

    public enum State {
    	//运行
        NEW,
    
    	//运行
        RUNNABLE,
    
    	//阻塞
        BLOCKED,
    
    	//等待
        WAITING,
    
    	//超时等待
        TIMED_WAITING,
    
    	//终止
        TERMINATED;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. 线程创建之后它将处于NEW(新建)状态
    2. 调用start()方法后开始运行,并且在线程获得了 CPU 时间片(timeslice)后就处于RUNNING(运行)状态
    3. 当线程调用 同步方法 时,在没有获取到锁的情况下,线程将会进入到BLOCKED(阻塞)状态
    4. 当线程执行wait()方法之后,线程进入WAITING(等待)状态
    5. 在 等待状态 的基础上增加了超时限制,比如通过sleep(long millis)方法或wait(long millis)方法可以将线程置于等待超时(TIMED WAITING)状态
    6. 线程运行完将会进入到TERMINATED(终止)状态
  • 相关阅读:
    MFC实现关闭窗口,弹出确认提示
    Java常量池理解
    最小二乘(Least Square)与多项式拟合(fitted polynomial)的理解
    每日一面系列之Spring中@Autowired和@Inject注解的区别?
    Kubernetes技术--k8s核心技术 configMap
    .NET 8 Preview 6发布,支持新的了Blazor呈现方案 和 VS Code .NET MAUI 扩展
    vue2实例
    Linux学习教程(第四章 Linux打包(归档)和压缩)
    3D封装技术发展
    高校部署房产管理系统可实现那些目标?
  • 原文地址:https://blog.csdn.net/qq_42709715/article/details/125544698