当前位置: 首页 > news >正文

【Java ee初阶】多线程(5)

一、wait 和 notify

wait notify 是两个用来协调线程执行顺序的关键字,用来避免“线程饿死”的情况。

wait  和 notify 其实都是 Object 这个类的方法,而 Object这个类是所有类的“祖宗类”,也就是说明,任何一个类,都可以调用wait 和notify这两个方法。

Java标准库中,涉及到阻塞的方法,都可能抛出InterruptedException

让我们来观察一下这个异常的名字。

Illegal:非法的,不正确的,不合理的(而不是违反法律的)、

Monitor:监视器/显示器(电脑的显示器,英文不是screen,而是Monitor)此处的Monitor指的是synchronized,synchronized在JVM里面的底层实现,就被称为“监视器锁”(JVM源码,变量名是Monitor相关的词)

所以这个异常的意思是,当前处于非法的锁状态。

众所周知,锁一共有两种状态,一种是加锁,一种是解锁。

wait方法内部做的第一件事情,就是释放锁。

而我们必须要先得到锁,才能去谈释放锁。因此,wait必须放到synchronized代码块内部去进行使用。

此处的阻塞会持续进行,直到其他线程调用notify把该线程进行唤醒。

此处的阻塞会持续进行,直到其他线程调用notify,将该线程进行唤醒。

package Thread;import java.util.Scanner;public class demo28 {// 将 object 变量移到类内部并添加 static 修饰符public static Object object = new Object();public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {synchronized (object) { System.out.println("t1 wait之前");try {object.wait(); } catch (InterruptedException e) {e.printStackTrace();}System.out.println("t1 wait之后"); }});Thread t2 = new Thread(() -> {Scanner scanner = new Scanner(System.in);System.out.println("请输入任意内容 尝试唤醒t1");scanner.next(); synchronized (object) { object.notify(); System.out.println("t2 notify之后"); }});     t1.start();t2.start();}   
}

输出:

图上这四处地方的锁,必须是同一个对象。

假设notify后面又有一堆别的逻辑,此时,这个锁就会再多占有一会。

【总结】wait要做的事情:

1、使当前执行代码的线程进行等待(把线程放到等待队列中去)

2、释放当前的锁

3、满足一定条件的时候被唤醒,并且重新尝试获取这把锁

(这三个步骤是同时进行的)

使用wait的时候,阻塞其实是有两个阶段的:

1、WAITING的阻塞:通过wait 等待其他线程的通知

2、BLOCKED阻塞:当收到通知之后,就会重新尝试获取这把锁。重新尝试获取这把锁,很可能又会遇到锁竞争

wait进行阻塞之后,需要通过notify唤醒。默认情况下,wait的阻塞也是死等。

这样子是不合理的,因此,我们在工作中需要设定等待时间上限。(超过时间)

括号里的等待时间是毫秒

package Thread;import java.util.Scanner;public class demo29 {public static Object locker = new Object();public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {synchronized (locker) {System.out.println("t1 wait之前");try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t1 wait之后");}});Thread t2 = new Thread(() -> {synchronized (locker) {System.out.println("t2 wait之前");try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t2 wait之后");}});Thread t3 = new Thread(() -> {synchronized (locker) {System.out.println("t3 wait之前");try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t3 wait之后");}});Thread t4 = new Thread(() -> {Scanner scanner = new Scanner(System.in);System.out.println("请输入任意内容 尝试唤醒t1、t2、t3");scanner.next();synchronized (locker) {System.out.println("t4 notify之前");locker.notify(); // 唤醒一个在 locker 上等待的线程,这里是 t1System.out.println("t4 notify之后");}});t1.start();t2.start();t3.start();t4.start();}}

输出:

可以看出,当前只是将t1唤醒了

再次尝试

唤醒的仍然是t1

咱们在多线程中谈到的“随机”其实不是数学上概率均等的随机,这种随机的概率是无法预测的。取决于调度器如何去调度。调度器里面,其实不是“概率均等的唤醒”,调度器内部也是有一套规则的。这套规则,对于程序员是“透明的”,程序员做的,就是不能依赖于这里的状态。

mysql的时候,select查询一个数据,得到的结果集,是按照怎样的顺序的呢?(是按照id的顺序,时间的顺序,排列的顺序的吗?)都不是,mysql就没有这样的承诺。必须加上orderby

notifyAll可以唤醒全部:

如果没有任何对象在wait,那么直接调用notify / notifyAll 会发生什么?
不会发生任何事情,直接凭空调用notify是没有任何副作用的

经典面试题:

请你谈一谈sleep  和 wait 的区别

1.wait 的设计就是为了提前唤醒。超时时间,是“后手”(B计划)

sleep 的设计就是为了到达时间再进行唤醒。虽然也可以通过Interrupt()进行提前唤醒,但是这样的唤醒是会产生异常的。(此处的异常表示:程序出现不符合预期的情况,才称为“异常”)

2.wait需要搭配锁来时进行使用,wait执行时会先释放锁

 sleep不需要搭配锁进行使用,当把sleep放到synchronized内部的时候,不会释放锁(抱着锁睡觉)

综上所述,在实际开发中,wait比sleep用的更多。

二、单例模式

单例模式是一种设计模式,校招中最常考到的设计模式之一。

为了使得新手的代码下线也能够有所保证,大佬们研究出了一些“设计模式”,用来解决一些固定的场景问题,这些问题有着固定的套路。

如果按照设计模式写,能够得到一个较为靠谱的代码,属于是一种软性要求。

设计模式有很多很多种类,不仅仅有23种。

单例模式 :单例,也就是单个实例(单个对象)。虽然一个类,在语法角度来说,是可以无限创建实例的,但是在实际的场景当中,可能有时候我们只希望这个类只有一个实例(例如JDBC)

那么,在Java代码中,如何实现单例模式呢?——有很多种实现方式,其中最主要的有两种模式:

1、饿汉模式

创建实例的时机是非常紧迫的。

由于此处的Instance是一个static 成员,创建时机,就是在类加载的时候。也就是说,程序一启动,实例就被创建好了。

package Thread;class Singleton{private static Singleton instance = new Singleton();public static Singleton getInstance(){return instance;}   //做了一个“君子协定”,让其他类不能new这个类,只能通过getInstance()方法获取这个类的实例。private Singleton(){}
}public class demo33 {public static void main(String[] args) {Singleton instance1 = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();System.out.println(instance1 == instance2);}}

  做了一个“君子协定”,让其他类不能new这个类,只能通过getInstance()方法获取这个类的实例。

2、懒汉模式

第一次使用这个实例的时候,才会创建这个实例,创建的时机更晚

上述两份代码,哪一份是线程安全的,哪一份是线程不安全的呢?

而懒汉模式容易因此下述问题:

最终只创建了一个实例!

实际开发中,单例类的构造方法可能是一个非常重量的方法。我们之前,代码中也有单例模式的使用。当时通过单例类,管理整个服务器程序所以来的所有数据(100G)。这个实例创建的过程,就会从硬盘上把100G的数据加载到内存当中。

那么,如何解决该问题呢?

我们可以通过加锁,将操作打包成原子的来解决该问题。

但是,这串代码仍然存在问题:逻辑上来看,我们只是在第一次调用的时候,才会涉及到线程安全问题,只要对象创建完毕,后序都是直接return了,就不涉及修改了。但是,此时这个代码,锁是每次调用都会加上的。明明已经线程阿耐庵了,但是还要再进行加锁,这并不合理。

图中,一摸一样的条件连续写了两遍。以前都是一个线程,这个代码执行下来,第一次判定和第二次判定,结论是一定相同的。

而现在是多线程,第一次判定和第二次判定,结论可以不一样。因为再第一次和第二次判定之间,可能有另外一个线程,修改了instance。多线程,打破了以前的认知。而后面学习的网络,EE进阶里面的框架,也会打破以前的认知。

在多线程当中,指令重排序容易引起线程安全问题。指令重排序是编译器优化的一种手段,这是编译器在确保逻辑一致的情况下,为了提高效率,调整代码的顺序,就可以让效率变高了。然而,指令重排序在遇见多线程就又出现问题了。

此处涉及到的指令是非常多的,为了简化这个模型,我们将他抽象成三个步骤:

1、申请内存空间

2、在内存空间上进行初始化(构造方法)

3、内存地址,保存到引用变量当中

在多线程中,由于指令重排序,容易引起上述问题。

Instance里面还没有任何的属性方法,但是已经被线程2拿去使用了!

那么,如何避免指令重排序的问题呢?

只需要加上volatile这个关键字。

volatile的意思是,针对这个变量的读写操作,不要触发优化。

相关文章:

【Java ee初阶】多线程(5)

一、wait 和 notify wait notify 是两个用来协调线程执行顺序的关键字,用来避免“线程饿死”的情况。 wait 和 notify 其实都是 Object 这个类的方法,而 Object这个类是所有类的“祖宗类”,也就是说明,任何一个类,都…...

售前赢单评分是越权吗?

相关文章 软件实施工作个人看法 当前部门软件产品经理的职责涵盖售前支持工作。此前梳理工作时,计划在每个售前支持项目完成后,由支持人对项目赢单概率进行评估,旨在通过这一机制筛选重点项目,为赢单率高的项目优先配置资源。 …...

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

uniapp中用canvas绘制简单柱形图&#xff0c;小容量&#xff0c;不用插件——简单使用canvas 完整代码 <template><view><!-- 学习数据 --><!-- 头部选项卡 --><view class"navTab"><view :class"listIndexi?activite:"…...

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤&#xff08;Windows 系统&#xff09; 2.2 激活与破解&#xff08;仅供学习参考&#xff09; 三、基础配置与优化 3.1 界面与编码设…...

WebRTC 服务器之SRS服务器概述和环境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平台的流媒体服务器&#xff0c;支持多种协议&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS&#xff0c;包括其用途、关键功能、架构和支持协议。SRS 旨…...

第R8周:RNN实现阿尔兹海默病诊断(pytorch)

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 一&#xff1a;前期准备工作 1.设置硬件设备 impo…...

vue+element 导航 实现例子

项目使用的是 vue 3&#xff0c;安装配置可以查看栏目前面的文章。 组件 导航&#xff1a;https://element-plus.org/zh-CN/component/menu.html 面包屑&#xff1a;https://element-plus.org/zh-CN/component/breadcrumb.html 安装element库 PS D:\code\my-vue3-project&g…...

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析 前言 在当今数字化商业蓬勃发展的时代&#xff0c;电商平台的数据量呈爆发式增长&#xff0c;对数据库性能、稳定性和扩展性提出了极高要求。本文章基于大型电商平台原本采用 MySQL 数据库&#xff0c;但随着业…...

Go小技巧易错点100例(三十)

本期分享&#xff1a; 1.切片共享底层数组 2.获取Go函数的注释 切片共享底层数组 在Go语言中&#xff0c;切片和数组是两种不同的元素&#xff0c;但是切片的底层是数组&#xff0c;并且还有一个比较重要的机制&#xff1a;切片共享底层数组。 下面这段代码演示了切片&…...

LeetCode 热题 100 78. 子集

LeetCode 热题 100 | 78. 子集 大家好&#xff0c;今天我们来解决一道经典的算法题——子集。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集&#x…...

苹果公司正在与亚马逊支持的初创公司Anthropic展开合作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)

1.智能路径处理&#xff1a;自动识别并修正文件扩展名&#xff0c;根据转换类型自动建议目标路径&#xff0c;实时路径格式验证&#xff0c;自动补全缺失的文件扩展名。 2.增强型预览功能&#xff1a;使用pandastable库实现表格预览&#xff0c;第三方模块自己安装一下&#x…...

Redis总结(六)redis持久化

本文将简单介绍redis持久化的两种方式 redis提供了两种不同级别的持久化方式&#xff1a; RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 5.3 相关性分析&#xff08;PEARSON/SPEARMAN相关系数&#xff09;5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数&#xff08; Pearson Corr…...

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

AIGC学术时代:DeepSeek如何助力实验与数值模拟

目录 1.实验和数值模拟工具 2.结合使用 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 在工程和科学研究的世界里&#xff0c;实验与数值模拟是探索未知、验证理论和推动创新的两大支柱。它们如同一对翅膀&#xff0c;让思想得以飞翔&#xf…...

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中&#xff0c;数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表&#xff0c;还是分析日志信息&#xff0c;合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数&#xff08;如 sort()、rsort()、asort() 等&#xff09;&#…...

2025年企业Radius认证服务器市场深度调研:中小企业身份安全投入产出比最优解

引言&#xff1a;数字化转型浪潮下的身份安全新命题 在混合办公成为常态、物联网设备呈指数级增长、网络攻击手段日益隐蔽的2025年&#xff0c;企业网络边界正在经历前所未有的重构。据IDC预测&#xff0c;全球企业网络安全投入中&#xff0c;身份与访问管理&#xff08;IAM&a…...

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-批量推理(三)

一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...

相同IP和端口的服务器ssh连接时出现异常

起因 把服务器上的一个虚拟机搞坏了&#xff0c;所以删除重新创建了一个&#xff0c;端口号和IP与之前的虚拟机相同。 ssh usernameIP -p port 时报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…...

VScode中关于Copilot的骚操作

目录 1. Ctrl I 直接在工作区对话 2.Tab 党福音&#xff1a;写注释生成代码 3. 连续写几行函数头&#xff0c;Copilot 会自动“补全全函数” 4. 自动写单元测试 5. 在注释中要求它写某种风格 6. 代码重写器 7. 多语言切换无痛自动翻译 8. 在空文件中写注释&#xff0c…...

linux inotify 资源详解

Linux 的 inotify 是一个强大的文件系统监控机制&#xff0c;允许应用程序实时监听文件和目录的变化。这对于需要响应文件系统事件的应用&#xff08;如配置热加载、备份工具、文件同步服务等&#xff09;至关重要。以下是对 inotify 资源的深度解析&#xff1a; 一、核心概念…...

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…...

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…...

AIDC智算中心建设:资源池化核心技术解析

目录 一、池化技术架构 二、池化核心技术 三、展望 一、池化技术架构 智能算力池化指依托云计算技术&#xff0c;整合 GPU/AI 芯片等异构算力资源&#xff0c;构建集中管理的资源池&#xff0c;并按上层智算业务的需求&#xff0c;对池化的资源进行统一调度、分配&#xff…...

flink监控指标

文章目录 一、flink yaml配置二、配置指标项情况 提示&#xff1a;以下是基于开源flink on k8s环境下配置监控指标(部分已实验&#xff0c;粗略记录) 一、flink yaml配置 配置完成后就可以在页面查询(部分 需要验证)指标 二、配置指标项情况 参考下面网址&#xff1a; 阿里…...

签名去背景图像处理实例

一、前言 在生活中我们经常用到电子签名&#xff0c;但有时候我们所获取的图像的彩色图像&#xff0c;我们需要获取白底黑字的电子签名&#xff0c;我们可以通过下面程序对彩色图像进行处理达到我们的处理目的。 原始彩色图像如下&#xff1a; 二、原始代码 clear all;close a…...

[人机交互]理解与概念化交互

零.本章重点&#xff08;理解和分析用户问题&#xff09; – 解释“问题空间”的概念和含义 – 解释如何概念化交互 – 描述什么是概念模型 – 讨论将界面隐喻作为概念模型的利弊 – 讨论界面具体化和抽象化各自的优缺点 – 概述概念设计和实际设计的关系 一.理解问题空间 简单…...

C与指针——常见库函数

字符串 #include<stdlibs.h> int abs(int); long labs(long); int rand(void);//0-RAND_MAX //字符串转值 int atoi(const char*); long atol(const char*); float atof(const char*);数学\排序 #include<math.h> \\常见三角&#xff0c;sqrt(); exp(); double p…...

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 一、初识list容器1.1 什么是list&#xff1f;1.2 核心特性1.3 典型应用场景 二、核心成员函数…...

Auto.js 脚本:清理手机数据但保留账号

Auto.js 脚本&#xff1a;清理手机数据但保留账号 以下是一个使用 Auto.js 实现的脚本&#xff0c;它可以帮你清理手机数据&#xff08;类似恢复出厂设置&#xff09;&#xff0c;同时尽可能保留已登录的账号状态。请注意&#xff0c;这个脚本不能完全等同于真正的恢复出厂设置…...

Web Workers 技术详解与最佳实践

Web Workers 是 HTML5 提供的一个强大的多线程解决方案&#xff0c;它允许在后台线程中运行 JavaScript 代码&#xff0c;从而避免阻塞主线程。本文将深入探讨 Web Workers 的技术实现和实际应用。 一、Web Workers 基础 1. 创建 Worker // 主线程代码 const worker new Wo…...

llama_factory0.9.3微调Qwen3

llama_factory微调QWen1.5-CSDN博客文章浏览阅读3.3k次,点赞36次,收藏10次。本文介绍了如何使用LLaMA-Factory微调Qwen1.5模型,包括1.8B和0.5B版本的训练细节。在数据、训练、LORA融合及...

Linux的时间同步服务器(附加详细实验案例)

一、计时方式的发展 1.古代计时方式​ 公元前约 2000 年&#xff1a;古埃及人利用光线留下的影子计时&#xff0c;他们修建高耸的大型方尖碑&#xff0c;通过追踪方尖碑影子的移动判断时间&#xff0c;这是早期利用自然现象计时的典型方式 。​商朝时期&#xff1a;人们开发并…...

【全队项目】智能学术海报生成系统PosterGenius--前后端系统介绍

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;大模型实战训练营_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 一. 前…...

COlT_CMDB_linux_tomcat_20250505.sh

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT MIDWARE_TOMCAT_DISCOVERY|discovery.tomcat[disc] #原型指标 #IT_RULE MIDWARE_TOMCAT_IP|ip[{#CATALINA_BASE}] #IT_RULE MIDWARE_TOMCAT_Startpid|Start_pid[{#CATALINA_BASE}] #IT_RULE MIDWARE_TOMCAT_hostname|hostname[{#CATALINA_…...

【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列

目录 说在前面准备工作编译llama.cpp运行Qwen3系列4B Q432B Q6温度 参考 说在前面 主板&#xff1a;未知x99cpu&#xff1a;E5 2666v3显卡&#xff1a;Mi 50 32G系统&#xff1a;ubuntu 22.04 准备工作 挂载磁盘(可选) 由于我的系统装在U盘上&#xff0c;访问文件系统会比较慢…...

《数据结构初阶》【顺序栈 + 链式队列 + 循环队列】

《数据结构初阶》【顺序栈 链式队列 循环队列】 前言&#xff1a;什么是栈&#xff1f;栈有哪些实现方式&#xff1f;我们要选择哪种实现方式&#xff1f;--------------------------------什么是队列&#xff1f;队列有哪些实现方式&#xff1f;我们要选择哪种实现方式&…...

TCP和UDP

一、基本概念 1. TCP&#xff08;传输控制协议&#xff0c; Transmission Control Protocol&#xff09; 面向连接&#xff08;Connection-oriented&#xff09;&#xff1a;在传输数据前&#xff0c;要建立连接&#xff08;三次握手&#xff09;可靠&#xff1a;保证数据按顺…...

AI小智本地前后端部署

AI小智本地部署 1.安装phpstudy 1.1.安装该软件是为了获得web环境&#xff1a;MySQLApacherediophpmyadmin&#xff0c;介绍如下&#xff1a; ✅ 1. MySQL&#xff08;数据库&#xff09; 作用&#xff1a;关系型数据库管理系统&#xff0c;存储结构化数据&#xff0c;如用…...

springboot+mysql+element-plus+vue完整实现汽车租赁系统

目录 一、项目介绍 二、项目截图 1.项目结构图 三、系统详细介绍 管理后台 1.登陆页 2.管理后台主页 3.汽车地点管理 4.汽车类别 5.汽车品牌 6.汽车信息 7.用户管理 8.举报管理 9.订单管理 10.轮播图管理 11.交互界面 12.图表管理 汽车租赁商城 1.首页 2.汽…...

直方图比较

目录 1、直方图比较的概念 2、直方图比较的主要原因 3、典型应用场景 4、基础直方图比较 5、多通道直方图比较 6、实时直方图检测 1、直方图比较的概念 直方图比较是通过数学方法计算两个直方图之间的相似度或差异度的技术。在计算机视觉中&#xff0c;直方图是对图像特征…...

【计算机视觉】3d人体重建:PIFu/PIFuHD:高精度三维人体数字化技术指南

深度解析PIFu/PIFuHD&#xff1a;高精度三维人体数字化技术指南 一、项目概述与技术突破1.1 技术定位与核心价值1.2 性能指标对比1.3 技术演进路线 二、环境配置与模型部署2.1 硬件要求2.2 软件安装基础环境配置附加组件安装 2.3 模型下载 三、核心算法解析3.1 网络架构设计多层…...

HTML05:超链接标签及应用

链接标签 <a href"path" target"目标窗口位置">链接文本或图像</a>文本超链接图像超链接 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>链接标签学习</title&…...

JAVA设计模式——(十一)建造者模式(Builder Pattern)

JAVA设计模式——&#xff08;十一&#xff09;建造者模式&#xff08;Builder Pattern&#xff09; 介绍理解实现Phone类具体手机类建造者测试 应用 介绍 建造者模式用于将对象的创建和表示进行分离&#xff0c;即对象创建的过程单独提取出来&#xff0c;作为建造者的职能&am…...

JavaScript 笔记 --- part7 --- JS进阶 (part2)

JS进阶(part2) 内置构造函数 Object: 用于创建对象 String: 用于创建字符串 Number: 用于创建数字 Array: 用于创建数组 Boolean: 用于创建布尔值 Function: 用于创建函数 Date: 用于创建日期对象 RegExp: 用于创建正则表达式对象 Error: 用于创建错误对象 Map: 用于…...

JavaScript 笔记 --- part8 --- JS进阶 (part3)

JS 进阶(part3) 深浅拷贝 只针对引用类型 浅拷贝 浅拷贝只拷贝外面一层的属性, 如果对象里面还有对象, 那么这个对象的引用会被拷贝过去, 所以修改其中一个属性会影响到另一个对象 const obj {name: "zhangsan",age: 18,child: {name: "xiaoming",ag…...

LeetCode 热题 100 46. 全排列

LeetCode 热题 100 | 46. 全排列 大家好&#xff0c;今天我们来解决一道经典的算法题——全排列。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个不含重复数字的数组 nums&#xff0c;返回其所有可能的全排列。全排列是排列组合中的经典问题&#xff0c;通常可…...

双目视觉的核心目标

通过计算左右图像中同一物体的像素点位置差&#xff08;视差&#xff09;&#xff0c;进而还原出物体在三维空间中的真实位置。 双目视觉的核心流程&#xff1a; 1️⃣ 相机标定&#xff08;calibration&#xff09; 获取左右相机的内参、外参和畸变参数。 获取投影矩阵 Q&a…...

《类和对象(上)》

引言&#xff1a; 上次我们学习了C的一些入门基础&#xff0c;但其实还没有入门C&#xff0c;想要入门C&#xff0c;肯定是要把类和对象这部分学透彻&#xff0c;这次先来学习类和对象&#xff08;上&#xff09; 一&#xff1a;类的定义 1. 类定义格式&#xff1a; class为…...