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

并发编程(5)

抛异常时会释放锁。

当线程在 synchronized 块内部抛出异常时,会自动释放对象锁。

public class ExceptionUnlockDemo {private static final Object lock = new Object();public static void main(String[] args) {Thread t1 = new Thread(() -> {synchronized (lock) {System.out.println("线程1获取到锁");try {// 模拟操作Thread.sleep(1000);// 抛出异常throw new RuntimeException("模拟异常");} catch (InterruptedException | RuntimeException e) {System.out.println("线程1捕获异常: " + e.getMessage());}// 异常发生后,锁已经被释放System.out.println("线程1执行完毕");}});Thread t2 = new Thread(() -> {// 短暂等待,确保t1先执行try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程2尝试获取锁");synchronized (lock) {System.out.println("线程2获取到锁");}});t1.start();t2.start();}
}

结果:

线程1获取到锁
线程1捕获异常: 模拟异常
线程2尝试获取锁
线程2获取到锁
线程1执行完毕

从输出能够看出,线程 1 在抛出异常之后,线程 2 就能够获取到锁,这表明线程 1 的锁已经因为异常而被释放了。

加锁的区域就是同步代码块

在 Java 中,被锁保护的代码区域被称为同步代码块(Synchronized Block)。当多个线程访问同一把锁的同步代码块时,会强制串行执行,从而保证线程安全。同步的意思就是说比如说一个线程在执行时访问了一个别锁的共享资源,在时间片结束后还占着资源,另一个线程也不能访问

public class SynchronizedExample {private final Object lock = new Object();  // 锁对象// 方法级同步(隐式锁为 this)public synchronized void method1() {// 同步方法的代码}// 代码块级同步(显式指定锁对象)public void method2() {synchronized (lock) {// 同步代码块,同一时刻只能被一个线程执行}}
}

monitor进monitor出

对于我们人来说,一个程序的执行开始和执行结束是可以理解的,但机器不行。我们计算机内部的指令经过编译之后是一长串的代码,程序以数组的形式存到页里,我们加的锁的区域在数组里不允许同时被访问。那么我们需要一些表记指出哪些区域的代码是被锁的不能同时访问。

首先我们要进行范围标记枷锁加锁我们知道这块资源是加锁标记还得。注意我们加锁是这样的。

第一,我们对要操作的资源加上所标记。

第二,我们要操作的资源这块是有这些指令对资源进行操作,这一堆指令要对资源进行操作,其中指令到这些区域。这些区域对它的操作不能是同时进行的,所以我们加锁的话有两个区域,一个是对资源本身加标记,另外一个对操作的资源的指令。也得指定所在的范围同步范围。

 monitor进monitor出就是标记这些指令里那一块是不能同时被线程所操作。

JAVA对象头

snchronized用的锁是存在Java对象头里的。如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节,即32bit.

我们在堆区域创建对象,每一个对象都有锁表记和对象表记,所属类型:类的地址指向方法区。

如果有数组的话有数组长度。

如果一个64位的操作系统可以安装32位或64位的程序。32位的操作系统只可以安装32位程序。如果cpu的一个时钟周期能够运算32位,那他只能安装32位的操作系统。那如果一个程序是64位的程序,它里边一个字宽就是64位。是32位的程序,那么它就只能说一个字宽是32位。从这个推理下,我们在64位的操作系统下安装了32位的程序,那么它一个字就是32位。也就是说字宽最终是受程序的位数影响

 
锁的升级与对比

在 Java 中,锁的升级是 JVM 为了优化锁性能而引入的机制。随着多线程竞争的加剧,锁会从无锁状态逐步升级为偏向锁、轻量级锁,最终升级为重量级锁。这种升级过程是不可逆的,旨在平衡不同竞争程度下的性能开销。

1. 锁升级的流程

锁的状态会根据竞争情况逐步升级:

无锁 → 偏向锁 → 轻量级锁 → 重量级锁

1.1 无锁状态(Normal)
  • 特点:对象头的 Mark Word 存储哈希码、分代年龄等信息。
  • 场景:没有线程访问同步块时。
1.2 偏向锁(Biased Locking)
  • 适用场景:只有一个线程频繁访问同步块。
  • 原理
    • 首次获取锁时,JVM 会在 Mark Word 中记录线程 ID(通过 CAS 操作)。
    • 该线程后续进入同步块时,无需任何同步操作,直接判断 Mark Word 中的线程 ID 是否匹配。
  • 优点无竞争时几乎无额外开销,性能最优。
  • 缺点:当其他线程尝试竞争锁时,需要撤销偏向锁,消耗 CPU。

 

 

1.3 轻量级锁(Lightweight Locking)
  • 适用场景:多个线程交替访问同步块(无竞争)。
  • 原理
    • 线程在栈帧中创建锁记录(Lock Record),并通过 CAS 将 Mark Word 复制到锁记录中。
    • 同时,Mark Word 会指向锁记录的地址。
    • 如果 CAS 成功,线程获得轻量级锁;如果失败,表示有竞争,锁会升级为重量级锁。
  • 优点:竞争不激烈时避免线程阻塞,减少用户态和内核态的切换。不进阻塞队列,快速循环看看自己请求的资源有没有解锁。
  • 缺点:频繁 CAS 操作可能消耗 CPU。
1.4 重量级锁(Heavyweight Locking)
  • 适用场景:多个线程同时竞争锁。
  • 原理
    • 依赖操作系统的互斥量(Mutex),线程会被阻塞并进入等待队列。
    • 锁释放时,需要唤醒等待的线程,涉及用户态和内核态的切换。
  • 缺点:线程阻塞和唤醒的开销大,性能最差。重量解锁的加锁和解锁都挺麻烦,不仅仅是修改对象头标记这么简单,还有很多枷锁过程,枷锁竞争过程。
 四种锁的对比
特性无锁偏向锁轻量级锁重量级锁
适用场景无同步需求单线程访问多线程交替访问多线程同时竞争
实现方式Mark Word 存储哈希码等信息Mark Word 存储线程 IDMark Word 指向线程栈中的锁记录Mark Word 指向 Monitor 对象
线程状态无需阻塞无需阻塞自旋等待阻塞等待
性能开销最低低(首次 CAS)中等(CAS 操作)最高(内核态切换)
优缺点无同步开销无竞争时最优避免线程切换线程频繁阻塞 / 唤醒
释放机制无需释放线程退出同步块时不释放,其他线程竞争时撤销解锁时通过 CAS 恢复 Mark Word解锁时唤醒等待线程

现在是几个线程对资源进行竞争只有一个才能竞争成功!只有一个竞争成功加上了锁。其他就会竞争失败。竞争失败的话会竞争失败会进阻塞队列。为什么进入阻塞队列:成功的线程即使时间片到期了,下次还是选中他可以立马执行。效率最高每个加锁资源对应一个阻塞队列
 

 然后第一个成功占资源的线程已经执行结束后,会给所有在阻塞队列的线程发通知,让他们回到就绪队列。

比较并且交换

比较并交换(Compare-and-Swap, CAS) 是一种实现无锁(Lock-Free)算法的原子操作,用于在多线程环境中实现同步。它允许线程在不使用锁的情况下安全地修改共享数据,从而避免了锁带来的上下文切换和线程阻塞开销。这种方式也是实现了写后读。

  • 如果内存地址 V 中的值等于预期旧值 A,则将该位置的值更新为新值 B,并返回 true
  • 如果内存地址 V 中的值不等于预期旧值 A,则不执行更新,返回 false

但也有缺点,他是分两步的先比较再交换。比如说线程1先比较,发现没问题可以交换,但此时时间片到期。线程2进入也比较发现也没问题,也要交换就有问题了。 他不是原子操作,所以无法实现。只能调用操作系统底层。

流水线技术。他减少了电路的切换。提升的整体速度。但是指令顺序会发生变化,会导致后边有个指令重排序导致的并发问题。

java中哪些类是线程安全的?concurrent 开头的是线程安全的集合。Atomic. 开头的也是线程安全的

private AtomicInteger atomicI = new AtomicInteger(0);private int i = 0;public static void main(String[] args) {final Counter cas = new Counter();List<Thread> ts = new ArrayList<Thread>(600);long start = System.currentTimeMillis();for (int j = 0; j < 100; j++) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10000; i++) {cas.count();cas.safeCount();}}});ts.add(t);}for (Thread t : ts) {t.start();}// 等待所有线程执行完成for (Thread t : ts) {try {t.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(cas.i);System.out.println(cas.atomicI.get());System.out.println(System.currentTimeMillis() - start);}/**        * 使用CAS实现线程安全计数器        */private void safeCount() {for (;;) {int i = atomicI.get();boolean suc = atomicI.compareAndSet(i, ++i);if (suc) {break;}}}/*** 非线程安全计数器*/private void count() {i++;}}

一个使用AtomicInteger实现的线程安全计数器atomicI,另一个是普通的非线程安全整数i。在多线程环境下运行这两个计数器,会看到不同的结果。

主要分析

  1. 线程安全问题

    • count()方法使用普通的i++操作,在多线程环境下会出现竞态条件(Race Condition),导致最终结果小于预期值。
    • safeCount()方法使用AtomicInteger和 CAS 操作,保证了原子性,最终结果是正确的。
  2. CAS 操作的实现

    for (;;) {int i = atomicI.get();boolean suc = atomicI.compareAndSet(i, ++i);if (suc) {break;}
    }
    
     

    这段代码通过循环 CAS 操作来保证原子性:

    • 获取当前值
    • 尝试更新为新值
    • 如果失败则重试,直到成功
  3. 性能考虑

    • 原子操作虽然避免了锁的开销,但在高竞争环境下可能会因为频繁重试而降低效率
    • 非原子操作虽然没有这些开销,但结果是错误的,所以不能只考虑性能

输出结果

对于 100 个线程,每个线程执行 10000 次递增操作:

  • atomicI.get()的输出结果应为:100 * 10000 = 1,000,000
  • i的输出结果通常会小于 1,000,000,因为非线程安全操作会导致部分递增丢失
  • 执行时间取决于系统环境,但通常原子操作会比非原子操作慢一些
  •  我们看由于它没有加锁。他100万字肯定有相互覆盖,最终的结果肯定不到100万,就极大概率不到100万,有没有看到100万的一个极小的可能?比较大的可能是到不了100万。因为会有相互覆盖的问题。能理解的加九。对他100万次调用

 ABA问题

在多线程编程中,ABA 问题(ABA Problem)是使用 CAS(Compare-and-Swap) 操作时可能遇到的一种特殊问题。它发生在一个值从 A 变为 B,然后再变回 A 的过程中,而 CAS 操作无法感知这个中间变化,误认为值没有被修改过。

1. ABA 问题的本质

CAS 操作的核心逻辑是:“如果当前值是预期值 A,则将其更新为 B”。但如果在检查期间,值经历了 A → B → A 的变化,CAS 会认为值 “没有变化” 并成功更新,而实际上值已经被其他线程修改过,可能导致潜在的错误。

2. ABA 问题示例

假设有一个共享变量 int value = 10,两个线程 T1 和 T2 同时操作它:

  1. T1 读取 value:T1 准备将 value 从 10 增加到 11,它先读取 value 的当前值为 10。
  2. T2 修改 value:T2 先将 value 改为 20,然后又改回 10(即 10 → 20 → 10)。
  3. T1 执行 CAS:T1 执行 CAS(预期值=10, 新值=11),发现当前值确实是 10,认为没有变化,成功将 value 改为 11。

问题:T1 认为 value 没有被修改过,但实际上它经历了 10 → 20 → 10 的变化,可能导致 T1 的操作基于错误的假设(例如,T1 可能期望 value 自从读取后没有被其他线程动过)。

3. ABA 问题的危害

  • 数据一致性风险:在某些业务逻辑中,中间状态的变化可能影响最终结果。例如:
    • 链表操作:删除节点 A,插入新节点 B(内容与 A 相同),此时 CAS 可能误判节点未变。
    • 账户余额:余额从 100 变为 200 再变回 100,CAS 可能允许重复扣款。
  • 逻辑错误:某些操作依赖值的连续性变化,而 ABA 可能破坏这种假设。

4.解决方法

解决 ABA 就加版本号就可以了

线程可见性

一个线程对共享变量做出了修改,其他线程能及时读取到最新的修改,这叫线程可见性
 

线程间如何通信和进程间如何通信

进程是由线程组成的。进程所有的功能线程全都有。进程所拥有的功能线程全都有。然后。线程拥有的功能进程不一定有进程的通信方式线程全都有

里边通信其实是指交换信息的意思,就把消息传递过去,线程的通信方式有两种共享内存和消息传递
 

 

 

相关文章:

并发编程(5)

抛异常时会释放锁。 当线程在 synchronized 块内部抛出异常时&#xff0c;会自动释放对象锁。 public class ExceptionUnlockDemo {private static final Object lock new Object();public static void main(String[] args) {Thread t1 new Thread(() -> {synchronized …...

自己拥有一台服务器可以做哪些事情

上大学时候&#xff0c;买了自己的第一台服务器在HoRain Cloud上&#xff0c;结果没有好好利用&#xff0c;刚工作时候&#xff0c;又买了一台HoRain Cloud服务器&#xff0c;就想着好好利用。 可以搭建一些学习环境&#xff0c;比如说数据库&#xff0c;gitlab什么的 …...

Node.js聊天室开发:从零到上线的完整指南

为让你全面了解Node.js聊天室开发&#xff0c;我会先介绍开发背景与技术栈&#xff0c;再按搭建项目、实现核心功能、部署上线的流程展开&#xff0c;还会分享优化思路。 Node.js聊天室开发实战&#xff1a;从入门到上线 在即时通讯日益普及的今天&#xff0c;基于Node.js搭建…...

Unity 如何使用Timeline预览、播放特效

在使用unity制作和拟合动画时&#xff0c;我们常用到Timeline&#xff0c;前后拖动滑轨&#xff0c;预览动画正放倒放非常方便。如果我们想对特效也进行这个操作&#xff0c;可以使用下文的步骤。 至此&#xff0c;恭喜你又解锁了一个新的技巧。如果我的分享对你有帮助&#xf…...

实物工厂零件画图案例(下)

文章目录 总练习模块文章索引气动顶针轴直线轴承座法兰盘平皮带中空传动轴减速机V带轮减速机箱体 简介&#xff1a;点击此处可以下载该文章的案例模型&#xff0c;加上这篇文章总共有七篇文章是用来练习solidworks软件应用与建模思路的&#xff0c;大概有30多个案例模型&#x…...

esp32课设记录(五)整个项目开源github

我把该项目开源到了github&#xff1a;https://github.com/whyovo/ESP32_course_project 以下是readme文档&#xff1a; ESP32 课设 项目概述 这是一个基于ESP32的课设&#xff0c;实现了多种功能模式的集成&#xff0c;包括信息显示、图片展示、MQTT通信、摩尔斯电码处理以…...

力扣每日一题5-19

class Solution { public String triangleType(int[] nums) { Arrays.sort(nums); if (nums[0] nums[1] < nums[2]) return “none”; if (nums[0] nums[1] && nums[1] nums[2]) return “equilateral”; if (nums[0] nums[1] || nums[1] nums[2]) return “is…...

CI/CD 深度实践:灰度发布、监控体系与回滚机制详解

CI/CD 深度实践&#xff1a;灰度发布、监控体系与回滚机制详解 一、引言 在现代软件开发中&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;是加快交付速度、提升质量的关键。面对复杂的分布式系统和海量用户&#xff0c;如何安全、快速地发布新版本&#xff0c…...

【日常笔记】wps如何将值转换成东西南北等风向汉字

在WPS表格中&#xff0c;若要将数值&#xff08;如角度值&#xff09;转换成“东、南、西、北”等风向汉字&#xff0c;可通过以下步骤结合自定义函数或条件判断实现&#xff1a; 一、wps如何将值转换 方法一&#xff1a;使用LOOKUP函数&#xff08;简化公式&#xff09;&…...

RabbitMQ的简介

三个概念 生产者&#xff1a;生产消息的服务消息代理&#xff1a;消息中间件&#xff0c;如RabbitMQ消费者&#xff1a;获取使用消息的服务 消息队列到达消费者的两种形式 队列&#xff08;queue&#xff09;:点对点消息通信&#xff08;point-to-point&#xff09; 消息进入队…...

中职大数据实验室解决方案分享

第1部分概述 1.1政策背景 2021年3月&#xff0c;教育部印发《职业教育专业目录(2021年)》&#xff0c;共设置19个专业大类、97个专业类、1349个专业。新版《目录》聚焦推进数字化升级改造&#xff0c;构建未来技术技能&#xff0c;优化和加强了5G、人工智能、大数据、云计算、…...

阿里云web端直播(前端部分)

阿里云&#xff1a;Web播放器快速接入_视频点播(VOD)-阿里云帮助中心 import Aliplayer from aliyun-aliplayerimport aliyun-aliplayer/build/skins/default/aliplayer-min.css<div id"J_prismPlayer" style"width: 300px; height: 300px;" />var …...

从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案

2025年5月23-25日&#xff0c;第63届中国高等教育博览会&#xff08;高博会&#xff09;将在长春中铁东北亚国际博览中心举办。作为国内高等教育领域规模大、影响力广的综合性展会&#xff0c;高博会始终聚焦教育科技前沿&#xff0c;吸引全国高校管理者、一线教师、教育科技企…...

阿里云国际站与国内站:局势推进中的多维差异

在当今数字化浪潮席卷全球&#xff0c;云计算成为企业与开发者关键助力的局势下&#xff0c;阿里云作为行业翘楚&#xff0c;其国际站与国内站备受关注。两者虽同宗同源&#xff0c;却在诸多方面存在着显著差异&#xff0c;这些差异犹如隐藏在幕后的齿轮&#xff0c;悄然影响着…...

Docker项目部署深度解析:从基础命令到复杂项目部署

Docker项目部署深度解析&#xff1a;从基础命令到复杂项目部署 注&#xff1a;根据黑马程序员javawebAI视频课程总结&#xff1a; 视频地址 详细讲义地址 一、传统部署困境与Docker破局之道 在传统Linux部署场景中&#xff0c;新手常被三大难题困扰&#xff1a; 命令记忆负…...

reserve学习笔记(花指令)

这是闲来无事逛博客时看到的一篇相关文章&#xff0c;觉得挺有意思。 定义 首先花指令其实就是没有用的指令&#xff08;垃圾指令&#xff09;&#xff0c;它穿插在真正的代码中&#xff0c;会导致反编译时出现问题&#xff0c;从而会影响我们的静态分析 分类以及讲解 花指…...

docker运行Redis

创建目录 mkdir -p /home/jie/docker/redis/{conf,data,logs}添加权限 chmod -R 777 /home/jie/docker/redis创建配置文件 cat > /home/jie/docker/redis/conf/redis.conf << EOF # 基本配置 bind 0.0.0.0 protected-mode yes port 6379# 安全配置 密码是root require…...

Django 项目中,将所有数据表注册到 Django 后台管理系统

在 Django 项目中,将所有数据表注册到 Django 后台管理系统中需要为每个模型(Model)创建一个对应的 ModelAdmin 类,并在 admin.py 文件中注册这些模型。以下是一个详细的步骤指南: 确保你的模型已定义 首先,确保你已经在 models.py 文件中定义了所有的数据模型。例如:py…...

pyspark测试样例

from pyspark.sql import SparkSession from pyspark.sql.functions import col, lit, concat 创建 SparkSession spark SparkSession.builder.appName(“SparkSQLExample”).getOrCreate() 创建 DataFrame&#xff08;可以是从 CSV、JSON 等文件读取&#xff09; data […...

Python学习笔记--使用Django操作mysql

注意&#xff1a;本笔记基于python 3.12&#xff0c;不同版本命令会有些许差别&#xff01;&#xff01;&#xff01; Django 模型 Django 对各种数据库提供了很好的支持&#xff0c;包括&#xff1a;PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调…...

HarmonyOS Next应用分层架构下组件封装开发实践

基于鸿蒙应用分层架构的ArkUI组件封装实践 在鸿蒙应用开发中&#xff0c;合理利用 ArkUI 组件进行封装&#xff0c;可以实现代码复用&#xff0c;提升开发效率。本文将结合鸿蒙应用分层架构的特点&#xff0c;详细探讨几个典型的 ArkUI 组件封装场景及其实现方案。 华为鸿蒙应…...

全能视频处理工具介绍说明

软件介绍 本文介绍的软件是FFmpeg小白助手&#xff0c;它是一款视频处理工具。 使用便捷性 这款FFmpeg小白助手无需安装&#xff0c;解压出来就能够直接投入使用。 主要功能概述 该工具主要具备格式转换、文件裁剪、文件压缩、文件合并这四大功能。 格式转换能力 软件支持…...

CSS实现过多的文本进行省略号显示

单行文本省略 .ellipsis {white-space: nowrap; /* 禁止换行 */overflow: hidden; /* 溢出内容隐藏 */text-overflow: ellipsis; /* 溢出部分显示为省略号 */width: 200px; /* 必须设置宽度 */ } 多行文本省略&#xff08;跨浏览器方案&#xff09…...

十三、Hive 行列转换

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月19日 专栏&#xff1a;Hive教程 在Hive中&#xff0c;数据的形态转换是数据清洗、分析和报表制作中的核心环节。行列转换尤为关键&#xff0c;它能将数据从一种组织形式变为另一种&#xff0c;以适应不同的业务洞察需求。本…...

Django之验证码功能

验证码功能 目录 1.绘制验证码 2.在登录页面里面实现验证码的功能 3.代码展示集合 这篇文章, 内容不是很多, 不过验证码, 是在网页里面比较常见的功能, 所有我们还是要掌握它&#xff01;&#xff01;&#xff01; 一、绘制验证码 绘制验证码, 我们需要用到图像, 然后在…...

代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

图论 题目 99. 岛屿数量 使用 DFS 实现方法 判断岛屿方法 1. 遍历图&#xff0c;若遍历到了陆地 grid[i][j] 1 并且陆地没有被访问&#xff0c;在这个陆地的基础上进行 DFS 方法&#xff0c;或者是 BFS 方法 2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记 //…...

Python Django 的 ORM 编程思想及使用步骤

目录 一、ORM 编程思想概述​ 二、Python 中使用 ORM 的主要优势​ 2.1 简化数据库操作​ 2.2 提高开发效率​ 2.3 减少错误​ 2.4 增强代码的可维护性​ 2.5 降低耦合性​ 三、Django 中使用 ORM 的详细步骤​ 3.1 创建应用模块​ 3.2 配置数据库信息​ 3.3 确定数…...

设计一个程序,将所有的小写字母转换为大写字母

汇编语言程序设计实验 实验内容 设计一个程序&#xff0c;将所有的小写字母转换为大写字母&#xff0c;此程序不能改变除字母a~z外的任何其它字符。 实验分析 实现的功能是将所有的小写字母转换为大写字母&#xff0c;此程序不能改变除字母a~z外的任何其它字符。可以分为以…...

Rust 学习笔记:关于错误处理的练习题

Rust 学习笔记&#xff1a;关于错误处理的练习题 Rust 学习笔记&#xff1a;关于错误处理的练习题想看到回溯&#xff0c;需要把哪个环境变量设置为 1&#xff1f;以下哪一项不是使用 panic 的好理由&#xff1f;以下哪一项最能描述为什么 File::open 返回的是 Result 而不是 O…...

使用docker——10分钟内 完成一个高可用的 MongoDB 副本集部署

实验目的 掌握 Docker 容器化部署 MongoDB 副本集 的方法 理解 主从同步、故障转移、数据一致性 等核心机制 熟悉 MongoDB 集群管理命令 和 运维监控技巧 &#x1f527; 实验环境 操作系统: Rocky Linux 9 / CentOS 7 软件依赖: Docker 20.10 docker-compose 1.29 硬件要…...

信息化的编程未来发展

信息化与数字化与编程领域与AI的爆炸发展是最近十几年瞠目结舌的事情&#xff0c;列举一下相关词汇&#xff1a; C#、AI、C、Python、.NET、API 、IDE、asp、JavaScript网页端、Visua Studio、VR、Github、OpenGL-webGL-计算机图形学、面向对象 、类库、GIS、GPU计算与显卡、可…...

计算机视觉与深度学习 | EMD-KPCA-LSTM、EMD-LSTM、LSTM回归预测对比,多输入单输出(Matlab完整程序和数据)

以下是针对EMD-KPCA-LSTM、EMD-LSTM和LSTM回归预测对比的完整可运行MATLAB实现。包含数据生成、特征处理、模型构建和性能评估全流程,并提供关键代码注释和注意事项。 完整代码实现(含数据生成) %% 清理环境 clear; clc; close all; warning off;%% 生成模拟数据(正弦波+噪…...

Ollama 如何在显存资源有限的情况下合理分配给不同的服务?

在显存资源有限的情况下&#xff0c;合理分配显存给不同服务需要结合硬件特性、软件配置和模型优化技术。以下是几种有效的方法&#xff1a; 1. 使用 Ollama 自身的资源限制参数 Ollama 提供了一些命令行参数来限制单个模型的资源使用&#xff1a; --ram&#xff1a;限制模型…...

2025-05-19 学习记录--Python-简易用户登录系统 + 计算天数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、简易用户登录系统 ⭐️ # 用户登录系统 # 用户名、密码、黑名单 users [{name: 小红, password: 123, status:True},{name…...

APP小程序抓包和下游代理

本文仅作学习/技术记录和交流&#xff0c;请勿进行非法活动&#xff0c;否则后果自负&#xff01; 本文将主要围绕对小程序、APP的抓包方法&#xff0c;同时介绍下游代理。 在本文中我们将用到 Burpsuite、Yakit 和 Proxifier来完成。 小程序&APP抓包 对于小程序或APP抓…...

UE 材质几个输出向量节点

PixelNormalWS...

【八股战神篇】Java多线程高频面试题(JUC)

目录 专栏简介 一 如何创建线程&#xff1f; 延伸 1. 创建 Java 线程的本质 二 说说线程的生命周期&#xff1f; 延伸 1.描述一下线程的生命周期图 2.线程的优先级对线程执行有何影响&#xff1f; 3.如何确保三个线程按照特定顺序执行&#xff1f; 三 并发和并行的区…...

【esp32 mqtt】 连接亚马逊-加密传输信息

文章目录 1 加密文件1.1 服务端证书1.2 客户端CA证书1.3 客户端私钥1.4 三者协同工作的流程 2 亚马逊创建物品3 esp32 程序编写3.1 证书文件读取3.2 MQTT配置3.2.1 配置结构体3.2.2 初始化客户端3.2.3 注册事件3.2.4 开启mqtt3.2.5 示例 3.3 事件回调函数3.2.1 示例 3.4 接收到…...

用于判断主子关系的方法的实现(orm是efcore)

HasParentChildRelationship 方法&#xff1a;主要用于判断给定实体集合中是否存在主子关系&#xff0c;通过检查实体的导航属性来实现。CheckForDependencies 方法&#xff1a;是一个辅助方法&#xff0c;负责具体的依赖关系检查&#xff0c;包括对已访问实体的跟踪&#xff0…...

《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性

引言 本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》一书的 Chapter 3: Loops and Iterators 中的 Item 21: Be Defensive when Iterating over Arguments。该条目深入探讨了在 Python 中处理迭代器&#xff08;iterator&#xff09;和…...

【python基础知识】Day30 模块和库的导入

学习python 学习python基础语法 处理任务需要用到的库 一、导入官方库的三种手段 1 标准导入&#xff1a;导入整个库 # 方式1&#xff1a;导入整个模块 import math# 导入库后&#xff0c;输出测试 print("方式1&#xff1a;使用 import math") print(f"圆周率…...

leetcode hot100刷题日记——4.盛最多水的容器

解答&#xff1a; 我的思路&#xff1a; class Solution{public:int maxArea(vector<int>& height){//遍历&#xff0c;我暴力找一下,时间超限// int vol0;// for(int i0;i<height.size()-1;i){// for(int ji1;j<height.size();j){// volmax(vol,…...

大二周周练翻译

翻译题 文章目录 翻译题[toc]中国茶道数字经济茶马古道中国父母现状电子商务长城大学生就业一带一路中国结 相遇的意义&#xff0c;是被你改变的那部分的我&#xff0c;代替你永远陪在我身边 点个赞呗&#xff01; 中国茶道 China is a country with a time-honored civilizat…...

深度学习————模型保存与部署

第一部分&#xff1a;模型保存基础 什么是模型保存&#xff1f; 当你训练好一个深度学习模型后&#xff0c;它会拥有“学习到的参数”&#xff0c;这些参数&#xff08;权重、偏置等&#xff09;构成了模型的“知识”。如果不保存这些参数&#xff0c;那么训练好的模型在关闭…...

5G金融互联:迈向未来金融服务的极速与智能新时代

5G金融互联:迈向未来金融服务的极速与智能新时代 大家好,我是Echo_Wish,今天咱们聊聊一个大家都十分关心的话题:5G网络在金融服务中的应用。咱们平时可能觉得5G只是打个电话、刷个视频更流畅了,但在金融服务领域,5G的低延时、大带宽和高可靠性正在悄然改变整个游戏规则。…...

交易所开发:构建功能完备的金融基础设施全流程指南

交易所开发&#xff1a;构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程&#xff1a;从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念&#xff0c;涵盖市场定位、技术实现、安全防护和持续迭代四大阶…...

Icecream Video Editor:简单易用的视频编辑软件,轻松打造专业视频

Icecream Video Editor 是一款简单易用的视频编辑软件&#xff0c;专为希望快速、高效编辑视频的用户设计。它提供了丰富的功能&#xff0c;包括视频剪辑、效果应用、音频处理和视频导出&#xff0c;满足用户在不同场景下的需求。无论是视频新手还是有一定基础的创作者&#xf…...

论文阅读--Logical quantum processor based on reconfigurable atom arrays

论文主要内容 研究背景与目标&#xff1a; 论文提出了一种基于可重构中性原子阵列的逻辑量子处理器&#xff0c;旨在通过量子纠错&#xff08;QEC&#xff09;和逻辑量子比特编码&#xff0c;解决物理量子比特的噪声限制问题。该处理器结合高保真度逻辑门操作、任意连接性和实时…...

安防综合管理系统EasyCVR视频融合平台安防知识:门禁系统与视频监控系统如何联动?

在现代安防体系中&#xff0c;视频监控与门禁系统是两大核心。前者实时记录画面&#xff0c;为安全事件追溯提供依据&#xff1b;后者精准管控人员出入。二者联动可提升安防智能化水平&#xff0c;实现门禁点图像抓拍与实时监视&#xff0c;在安全事件发生时快速整合信息&#…...

微机系统第二章-题目整理

80x86标志寄存器中ZF位等于1&#xff0c;说明( )。 A A&#xff0e;运算结果等于0 B. 运算结果大于0 C. 运算结果不等于0 D.运算结果溢出 8086CPU由哪两大部分组成&#xff1f;简述它们的主要功能。 总线接口部件BIU跟执行部件EU。 总线接口部件&#xff08;BIU&…...