JUC高并发编程1:JUC概述

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()); // NEWthread.start();System.out.println("线程状态: " + thread.getState()); // RUNNABLEtry {Thread.sleep(500); // 主线程等待500毫秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程状态: " + thread.getState()); // TIMED_WAITINGtry {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.xdnf.cn/news/148190.html

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

相关文章

python爬虫案例——抓取链家租房信息

文章目录 1、任务目标2、分析网页3、编写代码1、任务目标 目标站点:链家租房版块(https://bj.lianjia.com/zufang/) 要求:抓取该链接下前5页所有的租房信息,包括:标题、详情信息、详情链接、价格 如: 2、分析网页 用浏览器打开链接,按F12或右键检查,进入开发者模式;因…

spring 代码执行(CVE-2018-1273) 靶场攻略

靶场环境 vulhub/spring/CVE-2018-1273 漏洞复现 1.访问靶场地址 2.填写注册信息&#xff0c;bp抓包 3.添加poc username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/zcc")]&password&repeatedPassword 4.…

红黑树:强大的数据结构之插入详解,附图

一、红黑树概述 红黑树是一种自平衡二叉查找树&#xff0c;具有以下性质&#xff1a;节点要么是红色要么是黑色&#xff1b;根节点是黑色&#xff1b;每个叶子节点&#xff08;NIL 节点&#xff09;是黑色&#xff1b;每个红色节点的两个子节点都是黑色&#xff1b;从任一节点到…

Matlab|考虑柔性负荷的综合能源系统低碳经济优化调度

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要实现的是考虑柔性负荷的综合能源系统低碳经济优化调度&#xff0c;模型参考《考虑柔性负荷的综合能源系统低碳经济优化调度》&#xff0c;求解方法采用的是混合整数规划算法&#xff0c;通过matlabc…

C++_23_STL容器

文章目录 STL容器概念常用容器A string作用构造函数基本赋值操作获取字符串长度存取字符操作拼接操作查找和替换注意:查找是不存在返回-1比较操作截取操作插入与删除string与char * 转换 B vector概述与数组区别迭代器构造函数赋值操作插入与删除取值操作大小相关存储自定义类型…

【逐行注释】扩展卡尔曼滤波EKF和粒子滤波PF的效果对比,MATLAB源代码(无需下载,可直接复制)

文章目录 总述源代码运行结果改进方向总述 本代码使用 M A T L A B MATLAB MATL</

用c++实现分数(fraction)类

这个想法已经有3周&#xff0c;于是今天将它实现了。 Step 1基础&#xff1a; 我们需要定义一个class——fraction&#xff0c;全部属性定义为public class fraction{ public:}; 现在&#xff0c;让我们添加2个元素&#xff0c;分子和分母——fz和fw Step 1.1添加分子分母…

Linux C++ 开发9 - 手把手教你使用gprof性能分析工具

1. 什么是gprof&#xff1f;2. gprof的用法 2.1. 编译程序2.2. 运行程序2.3. 生成分析报告2.4. gprof常用参数说明2.5. 分析报告解读 2.5.1. Flat profile 各个字段的含义2.5.2. Call graph 各个字段的含义 3. Demo演示 3.1. demo04.cpp 源码3.2. 编译、运行和分析3.3. 查看分…

快速搭建Kubernetes集群

快速搭建Kubernetes集群 1 MacOS 1.1 下载 从 docker 下载 docker-desktop (opens new window)&#xff0c;并完成安装 1.2 启用 k8s 集群 启动 docker-desktop&#xff0c;打开preference 面板 切换到 Kubernetes 标签页&#xff0c;并勾选启动 Enable Kubernetes&#xff0c;…

个人防护装备检测系统源码分享

个人防护装备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

vcruntime140_1.dll无法继续执行代码的6种解决方法

在计算机编程和软件开发中&#xff0c;我们经常会遇到各种错误和问题。其中&#xff0c;vcruntime140_1.dll无法继续执行代码是一个常见的问题。这个问题可能会导致程序崩溃&#xff0c;影响我们的工作进度。因此&#xff0c;了解这个问题的原因以及如何解决它是非常重要的。 …

BOM【JavaScript】

BOM&#xff08;Browser Object Model&#xff09;是浏览器对象模型的缩写&#xff0c;它允许JavaScript与浏览器进行交互。BOM 提供了与浏览器窗口和框架相关的对象&#xff0c;使得开发者可以操作浏览器的各种功能。 BOM 的一些关键组成部分包括&#xff1a;window 对象表示…

文章结构元素分析系统源码分享

文章结构元素分析检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

【Joint Receiver Design for ISAC】Neyman person | Gaussian | MMSE estimator |

【1】统计信号处理 Neyman-Pearson criterion pp 425 【1】 R c E { g x ( n ) x ( n ) H g H } σ 2 I g g H σ 2 I , \mathbf{R}_c\mathbf{E}\{\mathbf{g}x(n)x(n)^H\mathbf{g}^H\}\sigma^2\mathbf{I}\mathbf{g}\mathbf{g}^H\sigma^2\mathbf{I}, Rc​E{gx(n)x(n)HgH}σ2…

Linux C# Day4

作业&#xff1a; 1.统计家目录下.c文件的个数 #!/bin/bash num0 for filename in ls ~/*.c do((num)) done echo $num2.定义一个稀疏数组(下标不连续)&#xff0c;写一个函数&#xff0c;求该稀疏数组的和&#xff0c;要求稀疏数组中的数值通过参数传递到函数中arr([2]9 [4…

【高中生讲机器学习】19. 各种经典聚类算法,一篇带你过完!(上)

创建时间&#xff1a;2024-09-11 首发时间&#xff1a;2024-09-23 最后编辑时间&#xff1a;2024-09-23 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名高一学生&#xff0c;热爱计…

Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook

文章目录 一 、计算属性1. 简写2. 完整写法 二、监视watch1. 监视【ref】定义的【基本类型】数据2. 监视【ref】定义的【对象类型】数据3. 监视【reactive】定义的【对象类型】数据4. 监视【ref】或【reactive】定义的【对象类型】数据中的某个属性5. 监视多个数据总结 三、wat…

Android下MVP和MVVM模式的实践

转载注明出处&#xff1a;https://blog.csdn.net/skysukai 1、前言 MVP和MVVM诞生已经好些年头了&#xff0c;记得刚毕业才参加工作的时候&#xff0c;第一次见到了有上万行的Activity&#xff0c;这种巨无霸的Activity维护起来简直就是噩梦。这时候&#xff0c;就需要进行代…

2024最新windows 11系统 PHP或者idea编译器-配置Git环境和使用教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 确保电脑上已安装到git,如下图所示&#xff1a;-是已安装好&#xff1a; 安装git教程&#xff1a; Git安装使用教程_git安装教程-CSDN博客 安装流程 点击左上角如图所示&#xff1a; 需要验证git本地 …

matlab恢复默认窗口布局

1.点击主页&#xff0c;选择布局 2.选择默认&#xff0c;即可恢复到默认的窗口布局