JUC高并发编程1:JUC概述

news2024/9/24 6:26:04

1 什么是JUC

1.1 JUC简介

JUC就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包,JDK 1.5 开始出现的。

1.2 进程与线程

进程(Process)和线程(Thread)是操作系统中用于实现多任务处理的两种基本概念。它们在操作系统中扮演着不同的角色,并且有着不同的特性和用途。

1.2.1 进程(Process)

定义

  • 进程是操作系统中资源分配的基本单位。一个进程就是一个正在执行的程序的实例,它包含了程序代码、数据、堆栈、文件描述符等资源。

特性

  1. 独立性:每个进程都有自己独立的地址空间,一个进程的崩溃通常不会影响其他进程。
  2. 资源分配:操作系统为每个进程分配独立的内存空间、文件描述符、CPU时间等资源。
  3. 创建与销毁:进程的创建和销毁需要较多的系统资源和时间,因为涉及到资源的分配和回收。
  4. 通信:进程之间的通信通常需要使用操作系统提供的进程间通信(IPC)机制,如管道、消息队列、共享内存等。

用途

  • 进程通常用于执行独立的任务,如运行一个独立的应用程序。

1.2.2 线程(Thread)

定义

  • 线程是进程中的一个执行单元,是操作系统调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源。

特性

  1. 共享资源:线程共享其所属进程的地址空间、文件描述符、全局变量等资源。
  2. 轻量级:线程的创建和销毁比进程快得多,因为它们共享进程的资源,不需要重新分配内存等资源。
  3. 通信:线程之间的通信相对简单,因为它们共享内存,可以直接访问共享变量。
  4. 并发性:多个线程可以在同一个进程中并发执行,从而提高程序的执行效率。

用途

  • 线程通常用于实现并发处理,如在图形用户界面(GUI)应用程序中处理用户输入和后台任务。

1.2.3 进程与线程的关系

  • 包含关系:一个进程可以包含多个线程,这些线程共享进程的资源。
  • 并发性:进程和线程都可以并发执行,但线程的并发性更强,因为它们共享资源,切换开销更小。
  • 隔离性:进程之间相互隔离,一个进程的崩溃通常不会影响其他进程;而线程之间共享资源,一个线程的错误可能会影响整个进程。

1.2.4 总结

  • 进程:独立的执行环境,资源分配的基本单位,适用于独立的任务。
  • 线程:共享进程资源的执行单元,调度的基本单位,适用于并发处理。

1.3 线程的状态

1.3.1 Java中的线程状态枚举类

在Java中,线程的状态是由Thread.State枚举类定义的。以下是Java中常见的线程状态:

public enum Thread.State {
    // 线程刚刚创建,但还没有启动
    NEW,

    // 线程正在运行或准备运行
    RUNNABLE,

    // 线程正在等待监视器锁,以便进入同步代码块或方法
    BLOCKED,

    // 线程正在等待某个条件的发生,通常是通过调用Object.wait()或Thread.join()
    WAITING,

    // 线程正在等待某个条件的发生,但有一个超时时间,通常是通过调用Object.wait(long)或Thread.sleep(long)
    TIMED_WAITING,

    // 线程已经执行完毕
    TERMINATED;
}

1.3.2 线程状态的转换

线程在生命周期中会经历不同的状态转换。以下是常见的线程状态转换图:

NEW -> RUNNABLE -> (BLOCKED | WAITING | TIMED_WAITING) -> TERMINATED
  1. NEW:线程刚刚创建,但还没有调用start()方法。
  2. RUNNABLE:线程正在运行或准备运行。
  3. BLOCKED:线程正在等待获取监视器锁,以便进入同步代码块或方法。
  4. WAITING:线程正在等待某个条件的发生,通常是通过调用Object.wait()Thread.join()
  5. TIMED_WAITING:线程正在等待某个条件的发生,但有一个超时时间,通常是通过调用Object.wait(long)Thread.sleep(long)
  6. TERMINATED:线程已经执行完毕。

1.3.3 示例代码

以下是一个简单的Java代码示例,展示了如何获取和打印线程的状态:

public class ThreadStateExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(1000); // 让线程进入TIMED_WAITING状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println("线程状态: " + thread.getState()); // NEW

        thread.start();
        System.out.println("线程状态: " + thread.getState()); // RUNNABLE

        try {
            Thread.sleep(500); // 主线程等待500毫秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("线程状态: " + thread.getState()); // TIMED_WAITING

        try {
            thread.join(); // 等待线程执行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("线程状态: " + thread.getState()); // TERMINATED
    }
}

1.3.4 wait/sleep的区别

wait():

  • 是 Object 类的方法。

  • 调用时必须持有对象的监视器锁。

  • 调用后会释放锁,进入等待状态。

  • 需要其他线程调用 notify() 或 notifyAll() 来唤醒。

  • 用于线程间的协调和同步。

sleep():

  • 是 Thread 类的方法。

  • 调用时不会释放锁。

  • 指定睡眠时间后自动唤醒。

  • 可以被中断,抛出 InterruptedException。

  • 用于延迟执行或控制线程的执行节奏

1.4 并发与并行

1.4.1 串行模式

串行模式(Serial Mode)是指在计算机系统中,任务或操作按照顺序一个接一个地执行,而不是并发执行。在这种模式下,每个任务必须在前一个任务完成后才能开始执行。串行模式通常用于确保任务的执行顺序和数据的一致性,特别是在需要严格控制执行顺序的场景中。

1.4.2 串行模式的特点

  1. 顺序执行:任务按照预定的顺序依次执行,前一个任务完成后,后一个任务才能开始。
  2. 单线程:通常在单线程环境中执行,没有并发性。
  3. 简单性:实现简单,不需要复杂的同步机制。
  4. 可靠性:由于任务顺序执行,数据一致性和可靠性较高。
  5. 性能限制:由于没有并发性,系统的整体性能可能受到限制,特别是在处理大量任务时。

1.4.3 并行模式

并行模式(Parallel Mode)是指在计算机系统中,多个任务或操作同时执行,而不是顺序执行。并行模式可以显著提高系统的处理能力和响应速度,特别是在多核处理器和分布式系统中。并行模式可以通过多线程、多进程、分布式计算等方式实现。

1.4.4 并行模式的特点

  1. 并发执行:多个任务可以同时执行,充分利用多核处理器和分布式系统的资源。
  2. 多线程/多进程:通过创建多个线程或进程来实现任务的并行执行。
  3. 复杂性:实现和维护相对复杂,需要处理线程间同步、资源竞争等问题。
  4. 性能提升:可以显著提高系统的处理能力和响应速度。
  5. 资源利用率高:在多核处理器上,并行模式可以充分利用多核资源,提高资源利用率。

1.4.5 并发

并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。

1.4.6 小结

  • 并发是指多个任务在同一时间段内交替执行,每个任务执行一段时间后,切换到另一个任务。并发强调的是任务的交替执行,而不是同时执行。
  • 并行是指多个任务在同一时刻同时执行。并行强调的是任务的同时执行,通常在多核处理器或多台计算机上实现。

1.5 管程

管程(Monitor)是一种用于实现线程同步的机制,它提供了一种高级的同步原语,使得多个线程可以安全地访问共享资源。管程通常包含一个或多个条件变量(Condition Variables),用于线程之间的等待和通知。管程的设计目标是简化并发编程中的同步问题,避免死锁和竞态条件。

1.5.1 管程的特点

  1. 互斥访问:管程确保在任何时刻只有一个线程可以进入管程,从而保证对共享资源的互斥访问。
  2. 条件变量:管程包含条件变量,用于线程之间的等待和通知。线程可以在条件变量上等待,直到其他线程发出通知。
  3. 同步机制:管程提供了一种高级的同步机制,简化了并发编程中的同步问题。
  4. 封装性:管程将共享资源和同步机制封装在一起,使得外部代码不需要关心同步细节。

1.5.2 管程的适用场景

  1. 生产者-消费者问题:多个生产者和消费者线程需要访问共享的缓冲区,通过管程可以实现线程之间的同步。
  2. 读者-写者问题:多个读者线程和写者线程需要访问共享的数据库,通过管程可以实现线程之间的同步。
  3. 互斥锁:需要对共享资源进行互斥访问的场景,通过管程可以简化同步问题。

1.6 用户线程和守护线程

在多线程编程中,线程可以分为两种类型:用户线程(User Thread)和守护线程(Daemon Thread)。它们在行为和用途上有一些显著的区别。

1.6.1 用户线程(User Thread)

定义

  • 用户线程是应用程序中创建的普通线程,通常用于执行用户任务。

特点

  1. 优先级高:用户线程的优先级通常较高,操作系统会优先调度用户线程。
  2. 独立性:用户线程是独立的,即使主线程结束,用户线程仍然可以继续执行。
  3. 生命周期:用户线程的生命周期不受主线程的影响,只有当所有用户线程都结束时,程序才会退出。

用途

  • 用户线程通常用于执行用户任务,如计算、I/O操作、用户界面更新等。

1.6.2 守护线程(Daemon Thread)

定义

  • 守护线程是一种特殊类型的线程,通常用于执行后台任务,如垃圾回收、日志记录等。

特点

  1. 优先级低:守护线程的优先级通常较低,操作系统不会优先调度守护线程。
  2. 依赖性:守护线程依赖于用户线程,当所有用户线程都结束时,守护线程会自动终止。
  3. 生命周期:守护线程的生命周期受用户线程的影响,只有当所有用户线程都结束时,守护线程才会终止。

用途

  • 守护线程通常用于执行后台任务,如垃圾回收、日志记录、定时任务等。

1.6.3 用户线程和守护线程的区别

  1. 优先级

    • 用户线程:优先级较高,操作系统会优先调度用户线程。
    • 守护线程:优先级较低,操作系统不会优先调度守护线程。
  2. 独立性

    • 用户线程:独立于主线程,即使主线程结束,用户线程仍然可以继续执行。
    • 守护线程:依赖于用户线程,当所有用户线程都结束时,守护线程会自动终止。
  3. 生命周期

    • 用户线程:生命周期不受主线程的影响,只有当所有用户线程都结束时,程序才会退出。
    • 守护线程:生命周期受用户线程的影响,只有当所有用户线程都结束时,守护线程才会终止。

1.6.4 示例代码

以下是一个简单的示例代码,展示了如何创建用户线程和守护线程:

public class ThreadExample {
    public static void main(String[] args) {
        // 创建用户线程
        Thread userThread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("User Thread: " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // 创建守护线程
        Thread daemonThread = new Thread(() -> {
            while (true) {
                System.out.println("Daemon Thread is running...");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // 设置守护线程
        daemonThread.setDaemon(true);

        // 启动线程
        userThread.start();
        daemonThread.start();

        // 主线程等待用户线程结束
        try {
            userThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread is finished.");
    }
}

1.6.5 总结

  • 用户线程:优先级较高,独立于主线程,生命周期不受主线程的影响,通常用于执行用户任务。
  • 守护线程:优先级较低,依赖于用户线程,生命周期受用户线程的影响,通常用于执行后台任务。

2 思维导图

在这里插入图片描述

3 参考链接

【【尚硅谷】大厂必备技术之JUC并发编程】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 基本指令的学习

01. ls 指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

计算机二级C语言疑难

1.strcpy函数 在C语言中strcpy&#xff08;&#xff09;函数会将字符串2&#xff08;包括字符串结束字符/0&#xff09;的函数覆盖到字符串1&#xff0c;如果字符串1没有足够的空间容纳字符串会导致缓冲溢出的错误 例题&#xff1a;程序设计 规定输入的字符串中只包含字母和…

2.Spring-容器-注入

注册&#xff1a;将组件放入容器中&#xff1b; 注入&#xff1a;让容器按需进行操作&#xff1b; 一、Autowired&#xff1a;自动注入组件 原理&#xff1a;Spring调用容器的getBean 二、Qualifier 精确指定 精确指定&#xff1a;如果容器中组件存在多个&#xff0c;则使用…

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强

Nginx基础详解1(单体部署与集群部署、负载均衡、正反代理、nginx安装)

本阶段的任务 1.学会集群的操作概念 2.完成对Nginx的入门操作 3.使用Nginx实现集群和负载均衡 4.使用Nginx实现高可用的方案 目录 1.单体部署与集群部署 1.1单体部署的概念 1.2单体部署的优缺点 1.3集群部署的概念 1.4集群部署的优缺点 1.5集群部署需要注意的点 1.…

嵌入式linux方向细分工作岗位分析

大家好,今天主要给大家分享一下,linux方向细分的工作岗位有哪些?,为即将进入linux领域的开发者指明方向。 第一:总结分布 第二:Linux BSP工程师岗位 工作内容: 1、开发和维护Linux系统的板级支持包(BSP),包括启动加载程序、设备驱动、文件系统等。 2、负责解决硬件和软…

2003-2022年各省区域创新能力评价相关指标数据(报告年份2003-2022年)

2003-2022年各省区域创新能力相关指标数据&#xff08;报告年份2003-2022年&#xff09; 1、来源&#xff1a;2003-2022年中国区城创新能力评价报告 2、指标&#xff1a;综合值、知识创造综合指标、研究开发投人综合指标、专利综合指标、科研论文综合指标、知识获取综合指标、…

个人导航网站介绍和部署

前言&#xff1a; 大家好&#xff0c;我是神的孩子都在歌唱&#xff0c;这是我csdn的博客 , 这是我做的一个神唱导航网站项目&#xff0c;这是一个练习项目&#xff0c;所以还存在很多问题&#xff0c;目的是方便收集和查阅日常浏览的网站&#xff0c;代码完全开源github&#…

LeetCode 面试经典150题 201.数字范围按位与

题目&#xff1a;给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 提示&#xff1a;0 < left < right < 2^31 - 1 思路&#xff1a; 位与的特性…

leetcode91. 解码方法,动态规划

leetcode91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; “1” -> ‘A’ “2” -> ‘B’ … “25” -> ‘Y’ “26” -> ‘Z’ 然而&#xff0c;在 解码 已编码的消息时&#xff0c;你意识到有许多不同的方式来解码&#xff0c;…

【漏洞复现】HIKVISION 视频编码设备接入网关 showFile.php 任意文件下载漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

PHP智慧教育新篇章优校管理系统小程序源码

智慧教育新篇章 —— 优校管理系统 &#x1f680;【开篇启航&#xff1a;智慧教育的浪潮已至】 在这个日新月异的时代&#xff0c;教育也在悄然发生着变革。随着科技的飞速发展&#xff0c;智慧教育已成为教育领域的新风尚。而“优校管理系统”&#xff0c;正是这股浪潮中的佼…

Keil5 操作

目录 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 2.代码提示设置&#xff1a; 3.添加. c与.h文件&#xff1a; 常用技巧 安装下载推荐&#xff1a;正点原子 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 文章讲解 …

【例题】证明极限

已知&#xff1a; ∀ ε > 0 , ∃ n > N , ∣ a n − A ∣ < ε \forall \varepsilon >0, \exist n>N,|a_n-A|<\varepsilon ∀ε>0,∃n>N,∣an​−A∣<ε 目标&#xff1a; ∀ ε > 0 , ∃ n > N 1 , ∣ a 1 . . . a n n − A ∣ < ε \…

pytorch学习笔记二:用pytorch神经网络模型做气温预测、分类任务构建和分类网络构建、卷积神经网络原理介绍

文章目录 一、搭建pytorch神经网络进行气温预测1&#xff09;基础搭建2&#xff09;实际操作标识特征和标签3&#xff09;构建成标准化的预处理数据&#xff08;做标准化收敛速度更快&#xff09; 二、按照建模顺序构建完成网络架构1&#xff09;np.array格式的标签(y)和特征(x…

从入门到精通:计算机视觉学习路线与实战项目推荐

全面解析计算机视觉的学习路径&#xff0c;深入探讨关键技术与实战项目&#xff0c;助您快速掌握核心技能 引言 随着人工智能的飞速发展&#xff0c;计算机视觉已成为AI领域中最具潜力和应用价值的分支之一。从自动驾驶到医疗影像分析&#xff0c;计算机视觉技术正在改变我们的…

9.23-部署项目

部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: ma…

【通俗易懂介绍OAuth2.0协议以及4种授权模式】

文章目录 一.OAuth2.0协议介绍二.设计来源于生活三.关于令牌与密码的区别四.应用场景五.接下来分别简单介绍下四种授权模式吧1.客户端模式1.1 介绍1.2 适用场景1.3 时序图 2.密码模式2.1 介绍2.2 适用场景2.3时序图 3.授权码模式3.1 介绍3.2 适用场景3.3 时序图 4.简化模式4.1 …

【LIO-SAM】LIO-SAM论文翻译(2020年)

【LIO】LIO-SAM论文翻译&#xff08;2020年&#xff09; 1&#xff0e;Abstract&#xff12;&#xff0e;INTRODUCTION&#xff14;&#xff0e;通过平滑和映射实现激光雷达惯性里程计A. 系统概述B. IMU Preintegration Factor&#xff08;推导过程参阅&#xff09;C. Lidar Od…

对onlyoffice进行定制化开发

基于onlyoffice8.0源码&#xff0c;进行二次开发&#xff0c;可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加&#xff0c;去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…