• 深入了解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(终止)状态
  • 相关阅读:
    Java 实现RSA 加解密算法 公钥加密传参
    【MySQL性能优化系列】select count(*)走二级索引比主键索引快几百倍,你敢信?
    ArcGIS Pro SDK (三)Addin控件 1 按钮类
    Dubbo入门---搭建一个最简单的Demo框架
    【数据结构】二叉树面试题总结(持续更新中...)
    docker部署rabbitmq的坑
    Java继承
    Golang 实现 Redis(11): RDB 文件格式
    真拿树莓派做Linux学习机靠谱不?
    电脑复制和粘贴的时候会出现Hello!
  • 原文地址:https://blog.csdn.net/qq_42709715/article/details/125544698