【JUC】复习指南

news2024/9/23 21:26:10

JUC复习指南:

JUC有哪些知识点?

  • 什么是Juc

  • Lock接口

  • 线程间通信

  • 集合的线程安全问题

  • 多线程锁

  • Callable接口

  • JUC三大辅助类 CountDownLatch CyclicBarrier Semaphore

  • 读写锁 ReetrantReadWriteLOck

  • 阻塞队列

  • ThreadPool线程池

  • Fork/join

  • CompletableFuture

  • 中断机制

  • LockSupport

  • JMM

  • volatile

  • CAS

  • 原子类

  • ThreadLocal

  • synchronized之锁升级

  • AQS

  • StampedLock

Q:什么是Juc

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

Q:线程的状态

 

public enum State {
        /**
         * Thread state for a thread which has not yet started.
         新建态,线程尚未执行
         */
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         
         可运行态,可以理解为操作系统本地线程的就绪态
         */
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         
         阻塞态,一个等待获得同步监视器,准备进入同步带模块的线程
         */
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         
         等待态,必须满足上述方法调用逻辑的情况下才能成为此状态
         */
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         
          超时等待态,必须满足上述方法调用逻辑的情况下才能成为此状态
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         终结态,线程完成执行任务。
         */
        TERMINATED;
    }

和操作系统里对进程、线程状态的描述还是有区别的

操作系统中 进程五态和线程的状态是类似的主要关注的就是 就绪 阻塞 执行

Q :wait/sleep 的区别

(1)sleep 是 Thread 的静态方法,wait 是 Object 的方法,任何对象实例都 能调用。

(2)sleep 不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提 是当前线程占有锁(即代码要在 synchronized 中)。

(3)它们都可以被 interrupted 方法中断。

Q:多线程并发问题的异步性问题

请注意,我问题中的【异步性】 是操作系统的特性,它指的是

操作系统对于进程/作业的调度顺序在业务层面来看是不确定的(并不是从具体调度算法的角度看),在并发执行任务的场景下,就可能出现这些现象:

  • 一个任务多次被执行,但是其他任务始终没用被执行

  • 理想希望任务按照一定的顺序执行,但实际执行中任务是乱序的。

在操作系统中,解决上述问题的办法,就是同步与互斥机制。

同步互斥机制在实现原理上基本就是硬件层面和软件层面,具体实现有原语、互斥锁,信号量,管程等机制。

同步是一种直接制约关系,它强调的是对进程/线程的工作顺序、传递信息进行控制,协调。

互斥是间接制约关系 它表现的是多个进程/线程对临界资源的访问关系,一者访问,其余等待。

在java中,对于并发执行产生的异步性问题,也有它自己的具体实现方案。除此之外,Java所说的异步处理任务,和操作系统异步性的概念是不一样的。

java的异步处理任务,是通过Java的某些API或外部中间件,使得的多个任务的执行互相不再发生干涉,简而言之,就是:

你干你的事,我干我的事,你干完给我一个结果通知,而不是让我干等你的执行结果,再开始工作。

但是请注意一点:不管是开发上的异步处理,同步、互斥,他们并不是在任何场景下都能用的,要根据具体业务场景来具体设计。

比如生产者-消费者模型下,缓冲区(容量是1)内必须要写满数据,消费者才能执行,缓冲区内为空,生产者才能生产。二者不可以同时访问缓冲区。

这个模型就是典型的同步+互斥。并不适合用异步处理。

那怎么用异步来改善这个模型呢?

假设当前的生产者执行的速率很快,消费者的执行速率很慢,此时就存在一个速度差。

为了缓解这个问题,我们可与模拟计算机网络的流量控制的思想,为消费者创建接收缓存队列(容量大于5),

假设生产速度是消费速度的5倍,缓冲区内很快塞满了,消费者一个一个的去消费,就可能让生产者一直等待。但是有了接收缓存队列后,生产者可以保持运行,也不必等待消费者必须把缓冲区的内容消费了,生产者可以生产到缓存队列满了再停等,减少了系统的停等时间。

进一步的,可以设计一个滑动窗口算法,让二者的发送和接收的速率达到一个平衡点。

通过一个缓存队列,把生产者和消费者的直接制约关系破坏,打破同步,形成异步关系,可以有效提高CPU的利用率,减少空等时间,提高了系统吞吐量。

 

java关于异步的一个API CompletableFuture,在后面再详细介绍。

Q:管程

管程实际上操作系统的一种进程同步工具。管程可以保证进程互斥,降低由于信号量pv操作不当引发的死锁问题

同一时间内,只有一个进程可以在管程内活动。

管程有自己的共享数据结构和具体过程

共享数据结构抽象的标识系统的共享资源,而对该数据结构执行的一组操作,可以定义为一组过程。进程对于共享资源的申请、释放等操作,都是通过这些过程来实现的。这组过程可以根据资源共享的情况,或接收或阻塞进程的访问,确保每次仅仅有一个进程使用共享资源,这样就实现对共享资源的统一管理,实现互斥。

简单来说,管程的定义结构如下:

  1. 管程的名称

  2. 局部于管程内的共享数据结构

  3. 对该数据结构进行操作的一组过程

  4. 对局部于管程内的数据结构的初始值语句

除了上面对管程的定义外,管程还具有条件变量

当一个进程进入管程后,其他所有尝试获取管程的进程会被阻塞,被加入该管程的阻塞队列。

直到该进程用完管程,释放资源,并且唤醒处于阻塞队列中的进程。

monitor Demo{
    共享数据结构 S;
    condition x;
    init_code(){...}
    
    take_away(){
        if(S<0) x.wait();
      	//若资源足够,则不用阻塞,直接进行分配
    }
    
    give_back(){
        归还资源 进一步处理;
        if(阻塞队列里有进程等待) x.signal() //唤醒一个进程
    }
}

现在我们回到java的管程——synchronized 同步监视器

JVM 中同步是基于进入和退出管程(monitor)对象实现的,每个对象都会有一个管程 (monitor)对象,管程(monitor)会随着 java 对象一同创建和销毁

执行线程首先要持有管程对象,然后才能执行方法,当方法完成之后会释放管程,方 法在执行时候会持有管程,其他线程无法再获取同一个管程.

我们可以看到,JVM中的管程是线程粒度的,毕竟,一个JVM只对应一个工作进程。

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

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

相关文章

【Docker】Docker容器化技术基础(一篇可以让你学到docker使用的文章)

Docker容器化技术 Docker&#xff08;软件跨环境迁移&#xff09;Docker概念&#xff1a;安装Dockerdocker架构配置Docker镜像加速器 一、Docker命令服务daemon相关的命令镜像相关命令Docker容器相关命令 二、Docker容器的数据卷数据卷概念配置数据卷配置数据卷容器 三、Docker…

关于简单C++函数在内存中的存储问题

举例 int main(){... }int data(){... }int add(){... } 在分段式存储管理时&#xff0c;根据人们的需求&#xff0c;人为分段存储 如图&#xff1a;

MySql用户管理、权限管理

用户管理 1. 查看系统用户&#xff08;查询mysql系统数据库中的user表&#xff09; select * from mysql.user; 2. 创建用户 CREATE USER 用户名主机名 identified by 密码 -- 创建用户zhonghua,只能在当前主句localhost访问,密码为123456 create user zhonghualocalhost i…

代码反向生成时序图类图-Visual_Paradigm实践

目录 前言 一、Visual_Paradigm介绍 1、主界面介绍 2、功能简介 二、基于代码的序列图生成 1、新建VP项目工程 2、序列图反向生成 三、VP类图生成 1、生成主入口 四、数据ER模型生成 1、SQL脚本 2、ER反向生成 总结 前言 不知道作为研发的小伙伴们&#xff0c;在平时的…

Endnote插入生成参考文献的四种方式

Endnote插入生成参考文献的四种方式 为了熟练Endnote进行在word中插入参考文献&#xff0c;本文介绍四种插入生成参考文献的四种方式。 一、采用Endnote插入按钮方式生成 word选中插入参考文献位置—转入endnote—选中要插入的文献—点击Endnote插入按钮&#xff0c;过程如图…

Java数据类型,一文带你彻底拿捏~

——Java中运算符是一种特殊的符号&#xff0c;用来进行数据的运算、赋值和比较等 思维导图 一.算术运算符 1.什么是算术运算符 ——算术运算符是用于数据类型值之间&#xff0c;使用2个或以上的数据进行运算 2.算术运算符概括 算术运算符 解释示例&#xff0c;-正号&…

CMake:检测python模块和包

CMake:检测python模块和包 导言项目结构CMakeLists.txt相关源码 导言 上一篇&#xff0c;我们基本了解了如何去检测python的解释器和python库。通常&#xff0c;代码是依赖于特定的python模块&#xff0c;无论是python工具、嵌入python的程序&#xff0c;还是扩展python的库。…

Spring Boot 项目应用消息服务器RabbitMQ(简单介绍)

一、背景 本章讲述的是在用户下单环节&#xff0c;消息服务器RabbitMQ 的应用 1.1 消息服务器的应用 在写一个电商项目的小demo&#xff0c;在电商项目中&#xff0c;消息服务器的应用&#xff1a; 1、订单状态通知&#xff1a;当用户下单、支付成功、订单发货、订单完成等…

训练、验证和测试一句话搞懂

文章目录 训练集&#xff08;training dataset&#xff09;验证集(validation dataset)测试集(test dataset)训练集可划分为训练集和验证集二二六&#xff0c;一一八&#xff0c;一一一百 训练集&#xff08;training dataset&#xff09; 类比课堂知识&#xff0c;训练模型得…

Python中enumerate用法详解

目录 1.简介 2.语法 3.参数 4.返回值 5.详解 6.实例 7.补充 1.简介 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 2.语法 以下是 enumerate() 方法的语…

勘探开发人工智能应用:人工智能概述

0 提纲 机器学习、深度学习、计算机视觉等技术已在勘探开发、油气生产、炼油炼化、经营管理等重点环节进行应用与推广。请思考&#xff1a; 输入&#xff1a;数据是什么(数字、文本、图)&#xff1f;如何理解数据&#xff1f;如何清洗数据&#xff1f;(需要专业领域知识)输出&…

鉴权服务-天G报错引发的感想:一定要有如果报错的预案

今天是HW第一天&#xff0c;下午运维人员说鉴权服务上不去了&#xff0c;看了眼天宫&#xff0c;结果重启了&#xff0c;后来的情况就是20多分钟半小时一重启&#xff0c;真么神奇。开始排查原因&#xff1a; 1、前两天发版换的agent版本发布&#xff0c;但是不知道有没有这个…

【Winform学习笔记(六)】warning MSB3274:引用dll版本冲突

warning MSB3274&#xff1a;引用dll版本冲突 前言正文1、解决方法 前言 在本文中主要介绍 解决 类库编译 Warning MSB3274 的方法&#xff1b; 在项目中引用了自定义控件库&#xff0c;界面设计时可以正常放置删除控件&#xff0c;但启动时会报异常&#xff1b; 编译提示&…

Selenium 是什么?简单明了的介绍

Selenium Selenium 是什么 Selenium 是一款 Web UI 测试工具&#xff0c;是一款 自动化测试 工具&#xff0c;使用 Selenium 测试工具进行的测试通常被称为 Selenium Testing&#xff0c;各种支持如下列表&#xff1a; UI 元素的支持与管理&#xff1a;自写代码实现浏览器支…

(八)穿越多媒体奇境:探索Streamlit的图像、音频与视频魔法

文章目录 1 前言2 st.image&#xff1a;嵌入图像内容2.1 图像展示与描述2.2 调整图像尺寸2.3 使用本地文件或URL 3 st.audio&#xff1a;嵌入音频内容3.1 播放音频文件3.2 生成音频数据播放 4 st.video&#xff1a;嵌入视频内容4.1 播放视频文件4.2 嵌入在线视频 5 结语&#x…

c语言每日一练(4)

五道选择题 1、有以下代码&#xff0c;程序的输出结果是( ) #include <stdio.h> int main() {int a 0, b 0;for (a 1, b 1; a < 100; a){if (b > 20) break;//1if (b % 3 1)//2{b b 3;continue;}b b-5;//3}printf("%d\n", a);return 0; } A.1…

JavaWeb(11)——前端综合案例5(小黑记事本)

一、实例需求 ⌛ 功能需求&#xff1a; ① 列表渲染 ② 删除功能 ③ 添加功能 ④ 底部统计 和 清空任务 二、代码实现 ☕ <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <meta http-equiv"X-UA-Compa…

intelJ IDEA\PHPStorm \WebStorm\PyCharm 通过ssh连接远程Mysql\Postgresql等数据库

最容易出错的地方是在general面板下的host&#xff0c;不应该填真实的host地址&#xff0c;而应该填localhost或者127.0.0.1 具体操作步骤见下图

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…

SpringBoot Thymeleaf模板引擎

Thymeleaf 模板引擎 前端交给我们的页面&#xff0c;是html页面。如果是我们以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp好处就是当我们查出一些数据转发到JSP页面以后&#xff0c;我们可以用jsp轻松实现数据的显示&#xff0c;及交互等。 jsp支持非常强大…