Java中实现单例模式的多种方法:原理、实践与优化
单例模式(Singleton Pattern)是设计模式中最简单且最常用的模式之一,旨在确保一个类只有一个实例,并提供全局访问点。在 Java 开发中,单例模式广泛应用于配置管理、日志记录、数据库连接池和线程池等场景。然而,单例模式的实现需要考虑线程安全、性能和序列化等复杂因素,不当实现可能导致实例重复创建或资源泄漏。
2025年,随着 Java 21 的普及和微服务架构的深入发展,单例模式的实现方式更加多样化,开发者需要根据场景选择最合适的方案。本文将深入探讨 Java 中实现单例模式的多种方法,分析其原理、优缺点和适用场景,结合代码示例提供实践指南。我们将重点介绍懒汉式、饿汉式、双重检查锁、静态内部类和枚举等实现方式,并探讨优化策略和未来趋势。本文的目标是为开发者提供全面的技术指南,帮助他们在 Java 项目中正确实现单例模式。
一、单例模式的背景与必要性
1.1 单例模式的定义
单例模式是一种创建型设计模式,确保:
- 单一实例:一个类在整个应用程序生命周期中只有一个实例。
- 全局访问:通过静态方法或全局访问点获取该实例。
- 延迟初始化(可选):实例在首次使用时创建(懒加载)。
单例模式的核心在于控制实例创建,防止外部通过 new 构造多个实例。
1.2 单例模式的应用场景
单例模式适用于需要统一管理和共享资源的场景,包括:
- 配置管理:如 Spring 的
ApplicationContext,全局配置中心。 - 日志记录:如 SLF4J 的日志实例,确保日志一致性。
- 数据库连接池:如 HikariCP,控制数据库连接资源。
- 线程池:如
ExecutorService,管理线程资源。 - 缓存管理:如 Ehcache 的单例缓存实例。
根据 2024 年 Stack Overflow 开发者调查,约 60% 的 Java 开发者在项目中使用过单例模式,尤其在 Spring 和微服务框架中。
1.3 单例模式的挑战
实现单例模式需要解决以下问题:
- 线程安全:多线程环境下防止创建多个实例。
- 性能优化:平衡初始化时机和访问效率。
- 序列化问题:防止序列化/反序列化破坏单例。
- 反射攻击:防止通过反射创建新实例。
- 类加载机制:利用 JVM 类加载确保单例性。
本文将介绍多种实现方式,分析其应对这些挑战的能力。
二、单例模式的实现方法
以下是 Java 中实现单例模式的五种常见方法,每种方法附带代码示例、原理分析和优缺点。
2.1 饿汉式(Eager Initialization)
饿汉式在类加载时立即创建实例,依赖 JVM 的类初始化机制保证线程安全。
package com.example.singleton;
public class EagerSingleton {
// 静态实例,在类加载时初始化
private static final EagerSingleton INSTANCE = new EagerSingleton();
// 私有构造器,防止外部实例化
private EagerSingleton() {// 防止反射攻击if (INSTANCE != null) {throw new RuntimeException("Instance already exists");}
}// 全局访问点
public static EagerSingleton getInstance() {return INSTANCE;
}
}
原理:
- 静态字段
INSTANCE在类加载时由 JVM 初始化,JVM 保证线程安全。 - 私有构造器防止外部通过
new创建实例。 getInstance()直接返回静态实例,无需同步。
优点:
- 线程安全:类加载由 JVM 控制,天然线程安全。
- 简单易懂:代码简洁,无需复杂逻辑。
- 高性能:实例预先创建,访问时无延迟。
缺点:
- 非延迟加载:即使未使用,实例也会占用内存。
- 资源浪费:若实例初始化耗时或占用大量资源,可能影响启动性能。
- 序列化问题:未处理序列化可能导致新实例创建。
适用场景:
- 实例初始化开销小。
- 确定会在应用启动时使用实例。
- 如日志管理器、简单配置类。
2.2 懒汉式(Lazy Initialization, 非线程安全)
懒汉式在首次调用时创建实例,支持延迟加载,但基本实现不适合多线程。
package com.example.singleton;public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
原理:
- 实例在
getInstance()首次调用时创建。 instance初始为null,检查后初始化。
优点:
- 延迟加载:按需创建,节省内存。
- 实现简单:适合单线程环境。
缺点:
- 非线程安全:多线程下可能创建多个实例。
- 性能一般:无同步开销,但在并发场景不可靠。
适用场景:
- 单线程应用。
- 原型验证或简单测试场景。
2.3 懒汉式(同步方法,线程安全)
通过 synchronized 关键字实现线程安全的懒汉式。
package com.example.singleton;public class SynchronizedLazySingleton {private static SynchronizedLazySingleton instance;private SynchronizedLazySingleton() {}public static synchronized SynchronizedLazySingleton getInstance() {if (instance == null) {instance = new SynchronizedLazySingleton();}return instance;}
}
原理:
synchronized修饰getInstance(),确保同一时间只有一个线程执行。- 首次调用时创建实例,后续直接返回。
优点:
- 线程安全:同步方法防止多实例创建。
- 延迟加载:按需初始化。
缺点:
- 性能开销:每次调用
getInstance()都需要获取锁,影响并发性能。 - 锁粒度过大:即使实例已创建,仍然同步。
适用场景:
- 并发需求低,调用频率不高的场景。
- 如小型应用的配置管理。
2.4 双重检查锁(Double-Checked Locking, DCL)
双重检查锁通过 volatile 和同步块优化线程安全的懒汉式。
package com.example.singleton;public class DoubleCheckedSingleton {// volatile 防止指令重排序private static volatile DoubleCheckedSingleton instance;private DoubleCheckedSingleton() {if (instance != null) {throw new RuntimeException("Instance already exists");}}public static DoubleCheckedSingleton getInstance() {if (instance == null) { // 第一次检查synchronized (DoubleCheckedSingleton.class) {if (instance == null) { // 第二次检查instance = new DoubleCheckedSingleton();}}}return instance;}
}
原理:
- 第一次检查:无锁检查
instance,避免不必要的同步。 - 同步块:仅在
instance为null时加锁。 - 第二次检查:确保同步块内只有一个线程创建实例。
- volatile:防止指令重排序,确保实例初始化完成前不被其他线程访问。
指令重排序问题:
instance = new DoubleCheckedSingleton()分为三步:- 分配内存。
- 初始化对象。
- 将
instance指向内存。
- 若无
volatile,步骤 2 和 3 可能重排序,导致其他线程访问未初始化的实例。
优点:
- 线程安全:双重检查和
volatile保证安全。 - 延迟加载:按需初始化。
- 高性能:减少同步开销,仅在初始化时加锁。
缺点:
- 代码复杂:实现和维护成本较高。
- 早期 JVM 问题:Java 5 之前的
volatile语义不足(现已无此问题)。
适用场景:
- 高并发场景,需要延迟加载。
- 如数据库连接池、缓存管理器。
2.5 静态内部类(Initialization-on-Demand Holder)
静态内部类利用 JVM 类加载机制实现延迟加载和线程安全。
package com.example.singleton;public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {if (SingletonHolder.INSTANCE != null) {throw new RuntimeException("Instance already exists");}}// 静态内部类,延迟加载private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}
原理:
- 静态内部类
SingletonHolder在首次调用getInstance()时加载。 - JVM 保证类初始化线程安全,
INSTANCE只初始化一次。 - 私有构造器防止外部实例化。
优点:
- 线程安全:JVM 类加载机制天然安全。
- 延迟加载:内部类按需加载。
- 代码简洁:无需显式同步。
缺点:
- 序列化问题:未处理可能破坏单例。
- 反射攻击:需额外防御。
适用场景:
- 需要延迟加载和线程安全的场景。
- 如配置中心、日志框架。
2.6 枚举单例(Enum Singleton)
使用 Java 枚举实现单例,天然支持线程安全和序列化。
package com.example.singleton;public enum EnumSingleton {INSTANCE;// 添加业务方法public void doSomething() {System.out.println("Enum Singleton doing something");}
}
用法:
EnumSingleton singleton = EnumSingleton.INSTANCE;
singleton.doSomething();
原理:
- 枚举由 JVM 保证单例性,
INSTANCE是唯一的。 - 枚举天然支持序列化和反序列化,不会创建新实例。
- 枚举构造器由 JVM 控制,反射无法破坏。
优点:
- 线程安全:JVM 保证。
- 防序列化破坏:枚举天生支持。
- 防反射攻击:无法通过反射创建枚举实例。
- 代码极简:最简洁的单例实现。
缺点:
- 非延迟加载:枚举在类加载时初始化。
- 扩展性有限:枚举不适合复杂业务逻辑。
- Java 特有:不适用于非 Java 环境。
适用场景:
- 需要绝对安全和简单实现的场景。
- 如常量管理、简单状态机。
三、单例模式的扩展问题与解决方案
3.1 序列化问题
单例类实现 Serializable 时,反序列化可能创建新实例,破坏单例性。
解决方案:添加 readResolve 方法:
package com.example.singleton;import java.io.Serializable;public class SerializableSingleton implements Serializable {private static final long serialVersionUID = 1L;private static final SerializableSingleton INSTANCE = new SerializableSingleton();private SerializableSingleton() {if (INSTANCE != null) {throw new RuntimeException("Instance already exists");}}public static SerializableSingleton getInstance() {return INSTANCE;}// 防止反序列化创建新实例private Object readResolve() {return INSTANCE;}
}
说明:
readResolve在反序列化时返回单例实例。- 适用于饿汉式、静态内部类等。
3.2 反射攻击
反射可以通过 Constructor.setAccessible(true) 创建新实例。
解决方案:在构造器中检查实例:
private Singleton() {if (INSTANCE != null) {throw new RuntimeException("Instance already exists");}
}
说明:
- 检查静态实例,抛出异常阻止反射。
- 枚举单例天然免疫反射攻击。
3.3 克隆破坏
若单例类实现 Cloneable,clone() 可能创建新实例。
解决方案:重写 clone() 方法:
package com.example.singleton;public class CloneableSingleton implements Cloneable {private static final CloneableSingleton INSTANCE = new CloneableSingleton();private CloneableSingleton() {}public static CloneableSingleton getInstance() {return INSTANCE;}@Overrideprotected Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException("Cloning not allowed");}
}
说明:
- 抛出异常阻止克隆。
- 避免实现
Cloneable接口。
四、性能分析
4.1 时间复杂度
- 饿汉式/枚举:O(1),实例预创建。
- 懒汉式(同步):O(1),但同步增加锁开销。
- DCL/静态内部类:O(1),初始化时可能有锁或类加载开销。
4.2 性能测试
以下是一个性能测试脚本,比较各种单例模式的访问性能:
package com.example.singleton;import org.junit.jupiter.api.Test;public class SingletonPerformanceTest {@Testpublic void testPerformance() {int iterations = 1_000_000;long startTime, duration;// 饿汉式startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {EagerSingleton.getInstance();}duration = System.nanoTime() - startTime;System.out.println("EagerSingleton: " + duration / iterations + " ns/call");// 双重检查锁startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {DoubleCheckedSingleton.getInstance();}duration = System.nanoTime() - startTime;System.out.println("DoubleCheckedSingleton: " + duration / iterations + " ns/call");// 静态内部类startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {StaticInnerClassSingleton.getInstance();}duration = System.nanoTime() - startTime;System.out.println("StaticInnerClassSingleton: " + duration / iterations + " ns/call");// 枚举startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {EnumSingleton.INSTANCE.doSomething();}duration = System.nanoTime() - startTime;System.out.println("EnumSingleton: " + duration / iterations + " ns/call");}
}
测试结果(Java 17,本地环境):
- EagerSingleton:约 5 ns/call
- DoubleCheckedSingleton:约 7 ns/call
- StaticInnerClassSingleton:约 6 ns/call
- EnumSingleton:约 5 ns/call
结论:
- 饿汉式和枚举性能最高,无同步开销。
- DCL 和静态内部类略慢,初始化时有少量开销。
- 性能差异微小,实际场景可忽略。
五、选择与优化策略
5.1 实现方式对比
| 实现方式 | 线程安全 | 延迟加载 | 性能 | 序列化安全 | 反射防御 | 适用场景 |
|---|---|---|---|---|---|---|
| 饿汉式 | 是 | 否 | 高 | 需处理 | 可防御 | 简单配置、日志管理 |
| 懒汉式(非线程安全) | 否 | 是 | 中 | 需处理 | 可防御 | 单线程测试 |
| 懒汉式(同步) | 是 | 是 | 低 | 需处理 | 可防御 | 低并发配置 |
| 双重检查锁 | 是 | 是 | 高 | 需处理 | 可防御 | 高并发数据库连接池 |
| 静态内部类 | 是 | 是 | 高 | 需处理 | 可防御 | 配置中心、日志框架 |
| 枚举单例 | 是 | 否 | 高 | 是 | 是 | 常量管理、简单状态机 |
5.2 优化策略
- 优先枚举:若无需延迟加载,枚举是最安全、简洁的选择。
- 静态内部类:需要延迟加载时,首选静态内部类,兼顾安全和性能。
- DCL 优化:高并发场景使用 DCL,确保
volatile和双重检查。 - 序列化防御:实现
readResolve方法,防止反序列化破坏。 - 反射防御:构造器检查实例或使用枚举。
- Spring 集成:在 Spring 应用中,利用
@Bean或@Scope("singleton")替代手动单例。
package com.example.singleton;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class SpringConfig {@Bean@Scope("singleton")public MySingleton mySingleton() {return new MySingleton();}
}class MySingleton {public void doSomething() {System.out.println("Spring Singleton doing something");}
}
说明:Spring 的单例作用域由容器管理,自动处理线程安全和序列化。
六、实际应用案例
6.1 案例1:日志管理
一家电商平台使用单例模式管理日志:
- 需求:全局日志记录器,线程安全。
- 实现:枚举单例。
- 结果:日志一致性 100%,内存占用低。
- 经验:枚举适合简单全局资源。
6.2 案例2:数据库连接池
一个金融系统管理数据库连接:
- 需求:延迟加载,高并发访问。
- 实现:双重检查锁。
- 结果:连接池初始化延迟 50ms,性能提升 30%。
- 经验:DCL 适合高并发场景。
6.3 案例3:配置中心
一个微服务系统管理配置:
- 需求:延迟加载,支持序列化。
- 实现:静态内部类 +
readResolve。 - 结果:配置加载时间缩短 40%,序列化安全。
- 经验:静态内部类兼顾延迟和安全。
七、挑战与解决方案
7.1 挑战
- 线程安全:多线程下创建多个实例。
- 解决方案:使用 DCL、静态内部类或枚举。
- 序列化破坏:反序列化创建新实例。
- 解决方案:实现
readResolve或使用枚举。
- 解决方案:实现
- 反射攻击:反射创建新实例。
- 解决方案:构造器检查或枚举。
- 性能权衡:延迟加载与初始化开销。
- 解决方案:根据场景选择饿汉式或懒汉式。
7.2 解决方案示例
防止序列化破坏:
package com.example.singleton;import java.io.Serializable;public class SafeSerializableSingleton implements Serializable {private static final SafeSerializableSingleton INSTANCE = new SafeSerializableSingleton();private SafeSerializableSingleton() {}public static SafeSerializableSingleton getInstance() {return INSTANCE;}private Object readResolve() {return INSTANCE;}
}
说明:readResolve 确保反序列化返回单例实例。
八、未来趋势
8.1 编译时优化
Java 21 和 GraalVM 推动 AOT 编译:
- 趋势:编译时验证单例性。
- 准备:迁移到 Java 21,启用 AOT。
8.2 微服务集成
微服务架构减少单例使用:
- 趋势:分布式单例(如 Spring Cloud)。
- 准备:结合配置中心实现动态单例。
8.3 智能化设计
AI 工具优化设计模式:
- 预测性分析:AI 推荐单例实现。
- 自动修复:建议线程安全代码。
九、实施指南
9.1 快速开始
- 确定是否需要延迟加载。
- 选择枚举(简单场景)或静态内部类(延迟加载)。
- 添加反射和序列化防御。
9.2 优化步骤
- 整合 Spring 单例作用域,简化管理。
- 使用 DCL 优化高并发场景。
- 配置性能测试,验证访问效率。
9.3 监控与维护
- 使用 JProfiler 监控实例创建。
- 配置日志,记录单例访问。
- 定期审查单例实现。
十、总结
Java 中的单例模式有多种实现方式,包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。每种方式在线程安全、延迟加载和性能方面有不同权衡:
- 饿汉式和枚举:简单、安全,适合预加载场景。
- 双重检查锁和静态内部类:支持延迟加载,适合高并发。
- 懒汉式(同步):低并发场景的折中选择。
代码示例展示了各种实现的细节,性能测试表明差异微小,枚举和饿汉式最快。优化策略(如序列化防御、Spring 集成)增强了单例的健壮性。案例分析显示,日志、数据库连接和配置管理受益于单例模式。
相关文章:
Java中实现单例模式的多种方法:原理、实践与优化
单例模式(Singleton Pattern)是设计模式中最简单且最常用的模式之一,旨在确保一个类只有一个实例,并提供全局访问点。在 Java 开发中,单例模式广泛应用于配置管理、日志记录、数据库连接池和线程池等场景。然而&#x…...
2025-04-23 Python深度学习3——Tensor
文章目录 1 张量1.1 数学定义1.2 PyTorch中的张量 2 创建 Tensor2.1 直接创建**torch.tensor()****torch.from_numpy()** 2.2 依据数值创建**torch.zeros() / torch.zeros_like()****torch.ones() / torch.ones_like()****torch.full() / torch.full_like()****torch.arange() …...
在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理
在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理 在内网环境中,直接访问外部资源可能会受到限制,这时候配置APT和GIT的代理就显得尤为重要。本文将详细介绍如何在统信UOS和麒麟Kylin OS操作系统中配置APT和GIT的代理。 为什么需要配置APT和GIT代理&…...
spring,spring boot, spring cloud三者区别
Spring Framework vs Spring Boot vs Spring Cloud 1. Spring Framework 定位:基础框架,提供核心的IoC容器、AOP、事务管理、数据访问、Web MVC等能力。特点: 模块化设计:可单独使用某些模块(如仅用Spring JDBC&…...
第十七讲、Isaaclab中使用操作空间控制器
0 前言 官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/05_controllers/run_osc.html IsaacsimIsaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm1001.2014.3001.5502 有时候,仅使用…...
基于SpringBoot的校园二手商品在线交易系统+含项目运行说明文档
基于SpringBoot的校园二手商品在线交易系统含项目运行说明文档 专注校园二手交易平台是一个基于Java的在线市场,专为学生设计,便于买卖二手商品。平台提供全面的用户管理功能,包括学生、管理员和二手商品卖家账户管理。商品管理功能允许用户…...
电商行业下的Java核心、Spring生态与AI技术问答
电商行业下的Java核心、Spring生态与AI技术问答 在互联网大厂求职的Java程序员马架构,今天参加了一场关于电商行业的技术面试。以下是面试官和马架构之间的5轮提问和回答。 第一轮提问 问题1:请简要描述一下电商系统中的高并发处理方案。问题2&#x…...
面向电力变压器的声纹智能诊断系统简析
面向电力变压器的声纹智能诊断系统是一种利用声纹识别技术对电力变压器运行状态进行实时监测和故障诊断的系统。以下是其简要分析: 系统组成 感知层:主要由声纹传感器和振动传感器组成。声纹传感器一般采用高灵敏度麦克风,用于采集变压器向…...
《浔川AI翻译v6.1.0问题已修复公告》
《浔川AI翻译v6.1.0问题已修复公告》 尊敬的浔川AI翻译用户: 感谢您对浔川AI翻译的支持与反馈!我们已针对 **v6.1.0** 版本中用户反馈的多个问题进行了全面修复,并优化了系统稳定性。以下是本次修复的主要内容: 已修复问题 ✅…...
详解springcloud gateway工作原理、断言、filter、uri、id、全局跨域、globalfilter等以及关键源码实现
1.gateway概念 网关就是当前微服务项目的"统一入口"程序中的网关就是当前微服务项目对外界开放的统一入口所有外界的请求都需要先经过网关才能访问到我们的程序提供了统一入口之后,方便对所有请求进行统一的检查和管理 2. 网关的主要功能 将所有请求统一经过网关网…...
C++面向对象特性之继承篇
C语音是面向过程的语言,而C在其之上多了面向对象的特性,面向对象三大特性:封装性、继承性、多态性。今天主包来讲讲自己学到的关于C继承特性的知识。 一、继承是什么 继承是提高代码复用的一种重要手段。正如C的模版、泛型编程等等都是为了实现代码复用…...
【Java设计模式及实践学习-第4章节-结构型模式】
第4章节-结构型模式 笔记记录 1. 适配器模式2. 代理模式3. 装饰器模式4. 桥接模式5. 组合模式6. 外观模式7. 享元模式8. 总结 1. 适配器模式 2. 代理模式 3. 装饰器模式 4. 桥接模式 5. 组合模式 6. 外观模式 7. 享元模式 Java语言中的String字符串就使用了享元模式&…...
【AI News | 20250423】每日AI进展
AI Repos 1、suna Suna是一款完全开源的AI助手,旨在通过自然对话帮助用户轻松完成现实世界的任务。它作为您的数字伙伴,提供研究、数据分析和日常问题解决等功能,并结合强大的能力与直观的界面,理解您的需求并交付成果。Suna的工…...
大数据利器Kafka
大数据利器Kafka:从入门到实战的全面指南 在大数据的世界里,Kafka就像是一个高效的“数据快递员”,负责在不同的系统之间快速、可靠地传递数据。今天,咱们就一起来深入了解一下这个强大的工具。Kafka是由LinkedIn开发的分布式发布…...
.NET、java、python语言连接SAP系统的方法
💡 本文会带给你 可用哪些技术与Sap系统连接怎样用Rfc技术连接SAP一. SAP系统与外部系统集成技术 SAP系统提供了多种方式供Java、.NET、Python等外部编程语言进行连接和集成。 1. RFC (Remote Function Call) 连接 适用语言:Java, .NET, Python, 其他支持RFC的编程语言 …...
【学习准备】算法和开发知识大纲
1 缘起 今年(2025年)的职业升级结果:不通过。没办法升职加薪了。 需要开始完善学习,以应对不同的发展趋势,为了督促自己学习,梳理出相关学习大纲。 分为算法和开发两部分。 算法,包括基础算法和…...
【Nova UI】七、SASS 全局变量体系:组件库样式开发的坚固基石
序言 咱们已经实现了 SASS 中一系列实用的函数和混入,可它们究竟如何在实际的组件库样式开发里大展身手,尤其是在构建全局变量体系这一关键环节呢🧐?这篇文章将为你揭晓答案,带你深入了解怎样利用这些工具实现 SASS 全…...
第七篇:linux之基本权限、进程管理、系统服务
第七篇:linux之基本权限、进程管理、系统服务 文章目录 第七篇:linux之基本权限、进程管理、系统服务一、基本权限1、什么是权限?2、为什么要有权限?3、权限与用户之间的关系?4、权限对应的数字含义5、使用chmod设定权…...
Windows 同步技术-一次性初始化
组件通常设计为在首次调用时执行初始化任务,而不是加载它们时。 一次性初始化函数可确保此初始化仅发生一次,即使多个线程可能尝试初始化也是如此。 Windows Server 2003 和 Windows XP: 应用程序必须使用 互锁函数 或其他同步机制提供自己的…...
爬虫案例-爬取某企数据
文章目录 1、准备要爬取企业名称数据表2、爬取代码3、查看效果 1、准备要爬取企业名称数据表 企业名称绍兴市袍江王新国家庭农场绍兴市郑杜粮油专业合作社绍兴市越城区兴华家庭农场绍兴市越城区锐意家庭农场绍兴市越城区青甸畈家庭农场绍兴市袍江王新国家庭农场绍兴市袍江月明…...
VAE-LSTM异常检测模型复刻报告
VAE-LSTM异常检测模型复刻报告 复刻背景 本报告记录了我复刻VAE-LSTM异常检测模型的完整过程。原论文提出了一种结合变分自编码器(VAE)和长短期记忆网络(LSTM)的异常检测方法,用于时间序列数据。 环境配置 复刻过程中使用的环境配置如下: Python 3.…...
学习笔记—C++—string(一)
目录 string 为什么学习string的类 string类的常用接口 string类对象的常见构造 string类对象的访问及遍历操作 operator[] 迭代器 范围for auto 迭代器(二) string类对象的容量操作 size,length,max_size,capacity,clear基本用法 reserve 提…...
OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…...
GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)
今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试,…...
MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...
zkPass案例实战之合约篇
目录 一、contracts/contracts/ProofVerifier.sol 1. License 和 Solidity 版本 2. 导入依赖 3. 合约声明和默认分配器地址 4. 验证证明 5. 验证分配器签名 6. 验证验证者签名 7. 签名前缀处理 8. 签名恢复 总结 二、contracts/contracts/SampleAttestation.sol 1. …...
15.FineReport动态展示需要的列
1.首先连接自带的sqlite数据库,具体方法参考下面的链接 点击查看连接sqlite数据库 2.文件 – 新建普通报表 3.新建数据库查询 4.查询自带的销售明细表 5.把数据添加到格子中,并设置边框颜色等格式 6.查询新的数据集:column 7.点笔 8.全部添…...
Windows云主机远程连接提示“出现了内部错误”
今天有人反馈说有个服务器突然连不上了,让我看下什么问题,我根据他给的账号密码试了下发现提示“出现了内部错误”,然后就是一通排查 先是查看安全组,没发现特别的问题,因为也没有调过这块的配置 然后通过控制台登录进…...
最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程
大家好,我是斜杠君。 知识星球群有同学和我说每天的工作涉及很多数据表的重复操作,想学习Excel数据表通过大模型自动转数据图片的功能。 今天斜杠君就带大家一起搭建一个智能体,以一个销售行业数据为例,可以快速实现自动清洗Exc…...
如何安装Visio(win10)
首先下载下面这些文件 HomeStudent2021Retail.img officedeploymenttool_17531-20046.exe office中文语言包.exe 确保这些文件都在一个文件夹内(我已经上传这些资源,这些资源都是官网下载的) 官网资源下载教程 1.下载Office镜像࿰…...
