单例模式深度解析:从线程安全到Spring框架实战
单例模式可能是你面试时被问得最多、工作中用得最广但也是最容易被“用错”的设计模式。很多人以为单例就是“一个类只能有一个实例”然后随手写个private static变量就完事了。但真正的问题在于在多线程环境下你写的那个“单例”真的安全吗在序列化、反射攻击面前它还能保持唯一吗在大型框架如 Spring 中单例又意味着什么如果你正在为“设计模式大作业”发愁或者困惑于如何在 Qt、Spring 或 Python 项目中正确实现一个线程安全的单例那么这篇文章就是为你准备的。本文将彻底拆解单例模式不仅告诉你“是什么”更会深入剖析“为什么”以及“怎么用才正确”。我们会从最基础的饿汉式、懒汉式讲到双重检查锁定、静态内部类再到枚举单例并对比它们在 Java、C、Python 等不同语言下的实现差异。更重要的是我们会探讨单例模式在 Spring 框架中的实际应用以及它可能带来的设计陷阱。读完本文你将能清晰理解单例模式的核心意图与多种实现方式。掌握线程安全的单例写法并能分析各种写法的优缺点。了解如何防御序列化、反射对单例的破坏。明白 Spring 框架中的“单例”与设计模式中的单例有何本质区别。获得可直接用于 Java、Python、C (Qt) 项目的实战代码示例。1. 单例模式解决什么问题又带来了什么新问题单例模式Singleton Pattern的核心意图非常明确确保一个类只有一个实例并提供一个全局访问点。这听起来简单但它解决的是软件开发中一个非常经典且普遍的痛点资源冲突与重复创建带来的性能损耗。想象一下这些场景数据库连接池如果每个请求都新建一个连接池系统资源将迅速耗尽。我们需要一个全局的、唯一的连接池管理器。配置文件读取器应用的配置信息在内存中只需一份多次读取文件既浪费 I/O也可能导致数据不一致。日志记录器所有模块都应该向同一个日志器写入以便统一管理格式、输出目标和日志级别。线程池、缓存系统等。在这些场景下单例模式通过“强制唯一实例”来保证资源管理的统一性和效率。然而它并非银弹。滥用单例尤其是将其作为“全局变量”的替代品会引入代码耦合度高、难以测试、隐藏依赖关系等问题。因此理解单例的适用边界与正确实现方式比单纯记住几种写法更重要。2. 核心概念与实现原理剖析在深入代码之前我们先明确几个关键概念这能帮你避开很多初级误区。2.1 单例模式的三要素私有化构造函数防止外部通过new关键字随意创建实例。这是实现“唯一性”的基础。静态私有实例变量用于持有该类的唯一实例。静态公有访问方法通常是getInstance()作为全局访问入口负责返回唯一实例。2.2 “懒加载”与“饿汉式”的本质区别这是单例实现的两个核心流派选择哪一种取决于你的资源敏感度和初始化时机要求。饿汉式Eager Initialization类加载时或编译时就初始化实例。优点是实现简单且天生线程安全由 JVM 类加载机制保证。缺点是如果这个实例非常耗费资源但程序可能永远用不到它就会造成资源浪费。懒汉式Lazy Initialization只有在第一次调用getInstance()时才创建实例。优点是延迟加载节省资源。缺点是实现线程安全需要额外成本如加锁。2.3 线程安全单例模式最大的挑战在单线程环境下单例实现很简单。但在多线程环境下多个线程可能同时调用getInstance()如果控制不当就会创建出多个实例彻底违背了单例的初衷。因此线程安全是实现一个健壮单例必须跨过的坎。后续的所有“高级”实现几乎都是为了在保证懒加载的前提下更优雅地解决线程安全问题。3. 环境准备与前置说明本文将提供 Java、Python 和 C (Qt 风格) 三种语言的示例。你可以根据你的主要技术栈选择阅读。Java 环境需要 JDK 8 或以上版本。本文代码不依赖特定框架可在任何标准 Java 项目中运行。Python 环境需要 Python 3.6 或以上版本。我们将使用标准库threading来模拟并发。C/Qt 环境需要支持 C11 的编译器如 g 5 MSVC 2015。Qt 示例基于 Qt 5 或 Qt 6 的核心模块不依赖 GUI。重要提示单例模式的核心思想是跨语言的但具体实现细节如内存模型、线程同步原语因语言而异。理解原理后你可以轻松地将模式适配到其他语言。4. 单例模式的演进之路从基础到最佳实践我们将按照从易到难、从问题到解决方案的顺序逐一拆解各种单例实现。每种实现都会附上优缺点分析和适用场景。4.1 饿汉式简单粗暴线程安全实现原理利用类加载机制保证线程安全。JVM 在加载类时会对静态变量进行初始化且这个过程是线程安全的。// 文件路径singleton/EagerSingleton.java public class EagerSingleton { // 1. 静态私有实例类加载时即初始化 private static final EagerSingleton INSTANCE new EagerSingleton(); // 2. 私有构造函数 private EagerSingleton() { System.out.println(EagerSingleton 实例被创建); } // 3. 静态公有访问方法 public static EagerSingleton getInstance() { return INSTANCE; } // 示例方法 public void doSomething() { System.out.println(Doing something...); } }Python 实现# 文件路径singleton/eager_singleton.py class EagerSingleton: # 类属性模块加载时即创建 _instance None def __new__(cls): if cls._instance is None: print(EagerSingleton 实例被创建) cls._instance super().__new__(cls) return cls._instance def do_something(self): print(Doing something...) # Python 模块本身也是单例的一种天然形式但这里展示类实现。C 实现// 文件路径singleton/EagerSingleton.h #pragma once #include iostream class EagerSingleton { public: // 删除拷贝构造和赋值操作确保唯一性 EagerSingleton(const EagerSingleton) delete; EagerSingleton operator(const EagerSingleton) delete; // 静态公有访问方法 static EagerSingleton getInstance() { return instance_; } void doSomething() { std::cout Doing something... std::endl; } private: // 私有构造函数 EagerSingleton() { std::cout EagerSingleton 实例被创建 std::endl; } // 静态私有实例 static EagerSingleton instance_; }; // 在实现文件中初始化静态成员 // singleton/EagerSingleton.cpp #include EagerSingleton.h EagerSingleton EagerSingleton::instance_;优点实现简单线程安全。缺点不是懒加载如果实例初始化依赖外部资源或耗时很长会导致类加载缓慢且可能浪费资源。适用场景实例占用内存小初始化快且程序运行过程中几乎一定会用到。4.2 懒汉式线程不安全版最直观的陷阱这是新手最容易写错的一种。它实现了懒加载但在多线程下会失败。// 文件路径singleton/UnsafeLazySingleton.java public class UnsafeLazySingleton { private static UnsafeLazySingleton instance; private UnsafeLazySingleton() { System.out.println(UnsafeLazySingleton 实例被创建 (可能多次)); } public static UnsafeLazySingleton getInstance() { if (instance null) { // 线程A和线程B可能同时进入这里 instance new UnsafeLazySingleton(); } return instance; } }问题当两个线程同时执行到if (instance null)时都会认为实例为空从而各自创建一个新对象单例被破坏。4.3 懒汉式同步方法版以性能为代价的安全最简单的修复方式是在getInstance()方法上加synchronized关键字。// 文件路径singleton/SynchronizedLazySingleton.java public class SynchronizedLazySingleton { private static SynchronizedLazySingleton instance; private SynchronizedLazySingleton() { System.out.println(SynchronizedLazySingleton 实例被创建); } // 使用 synchronized 保证线程安全 public static synchronized SynchronizedLazySingleton getInstance() { if (instance null) { instance new SynchronizedLazySingleton(); } return instance; } }优点线程安全实现了懒加载。缺点每次调用getInstance()都需要同步即使实例已经创建。这会造成不必要的性能开销。适用场景对性能要求不高的场景。4.4 双重检查锁定DCL经典的优化方案为了减少同步开销双重检查锁定Double-Checked Locking应运而生。它只在实例未创建时进行同步。// 文件路径singleton/DoubleCheckedLockingSingleton.java public class DoubleCheckedLockingSingleton { // 注意必须使用 volatile 关键字 (Java 5) private static volatile DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() { System.out.println(DoubleCheckedLockingSingleton 实例被创建); } public static DoubleCheckedLockingSingleton getInstance() { if (instance null) { // 第一次检查避免不必要的同步 synchronized (DoubleCheckedLockingSingleton.class) { if (instance null) { // 第二次检查确保线程安全 instance new DoubleCheckedLockingSingleton(); } } } return instance; } }关键点两次判空第一次检查无锁是为了提高性能如果实例已存在直接返回。第二次检查有锁是为了防止多个线程同时通过第一次检查后重复创建实例。volatile关键字 (Java)这是必须的在 Java 内存模型中instance new Singleton()这行代码并非原子操作它可能被重排序。volatile可以禁止指令重排序确保其他线程看到的是一个完全初始化好的对象。没有volatileDCL 在旧版本 JVM 或特定架构下仍然是线程不安全的。C 实现 (C11后)// 文件路径singleton/DoubleCheckedLockingSingleton.h #pragma once #include iostream #include mutex #include atomic class DoubleCheckedLockingSingleton { public: DoubleCheckedLockingSingleton(const DoubleCheckedLockingSingleton) delete; DoubleCheckedLockingSingleton operator(const DoubleCheckedLockingSingleton) delete; static DoubleCheckedLockingSingleton getInstance() { DoubleCheckedLockingSingleton* tmp instance_.load(std::memory_order_acquire); if (tmp nullptr) { std::lock_guardstd::mutex lock(mutex_); tmp instance_.load(std::memory_order_relaxed); if (tmp nullptr) { tmp new DoubleCheckedLockingSingleton(); instance_.store(tmp, std::memory_order_release); } } return *tmp; } void doSomething() { std::cout Doing something with DCL... std::endl; } private: DoubleCheckedLockingSingleton() { std::cout DoubleCheckedLockingSingleton 实例被创建 std::endl; } static std::atomicDoubleCheckedLockingSingleton* instance_; static std::mutex mutex_; }; // singleton/DoubleCheckedLockingSingleton.cpp #include DoubleCheckedLockingSingleton.h std::atomicDoubleCheckedLockingSingleton* DoubleCheckedLockingSingleton::instance_{nullptr}; std::mutex DoubleCheckedLockingSingleton::mutex_;注意C11 之后使用std::atomic配合std::mutex可以实现安全的 DCL。std::atomic保证了指针操作的原子性和内存顺序。优点线程安全延迟加载且大部分时间无需同步性能较好。缺点实现相对复杂需要理解内存模型volatile或atomic。适用场景对性能有要求的并发场景。这是实践中非常常用的一种实现。4.5 静态内部类优雅的 JVM 级解决方案Java 专属这是《Effective Java》推荐的一种方式。它利用了 JVM 类加载机制静态内部类只有在被引用时才会加载。// 文件路径singleton/StaticInnerClassSingleton.java public class StaticInnerClassSingleton { private StaticInnerClassSingleton() { System.out.println(StaticInnerClassSingleton 实例被创建); } // 静态内部类 private static class SingletonHolder { private static final StaticInnerClassSingleton INSTANCE new StaticInnerClassSingleton(); } public static StaticInnerClassSingleton getInstance() { return SingletonHolder.INSTANCE; // 这里才会加载 SingletonHolder 类 } }原理当StaticInnerClassSingleton被加载时其静态内部类SingletonHolder并不会被加载。只有当调用getInstance()方法时JVM 才会加载SingletonHolder并初始化其静态变量INSTANCE。而类的加载过程是线程安全的因此这种方式既实现了懒加载又无需额外的同步开销。优点线程安全延迟加载实现简洁无同步性能损耗。缺点无法传递参数进行初始化因为实例创建由 JVM 在类加载时完成。适用场景Java 项目中首选的单例实现方式之一除非需要延迟初始化参数。4.6 枚举单例终极防御者Java 专属这是《Effective Java》作者 Josh Bloch 大力推荐的方式也是实现单例的最佳方法。// 文件路径singleton/EnumSingleton.java public enum EnumSingleton { INSTANCE; // 唯一的实例 // 可以添加实例方法 public void doSomething() { System.out.println(Doing something with Enum Singleton); } // 枚举的构造方法默认是 private 的 EnumSingleton() { System.out.println(EnumSingleton 实例被创建); } } // 使用方式 // EnumSingleton instance EnumSingleton.INSTANCE; // instance.doSomething();为什么是“终极”的线程安全Java 枚举的实例创建由 JVM 保证线程安全。防止反射攻击反射无法通过Constructor.newInstance()创建枚举实例JVM 会抛出IllegalArgumentException。防止序列化破坏Java 规范保证了枚举类型的序列化和反序列化机制只会返回同一个实例不会创建新的对象。实现简单代码极其简洁。优点绝对安全线程、反射、序列化实现简单。缺点不够灵活无法继承其他类因为枚举已隐式继承Enum且某些旧框架可能不支持枚举注入。适用场景在 Java 中如果单例不需要继承其他类强烈推荐使用枚举方式。5. 进阶挑战防御反射与序列化攻击即使你用了双重检查锁定或静态内部类单例仍然可能被“攻破”。5.1 防御反射攻击反射可以调用私有构造函数。对于非枚举单例可以在构造函数中添加防御代码。// 文件路径singleton/ReflectionProofSingleton.java public class ReflectionProofSingleton { private static volatile ReflectionProofSingleton instance; private static boolean isInstantiated false; // 标志位 private ReflectionProofSingleton() { synchronized (ReflectionProofSingleton.class) { if (isInstantiated) { throw new RuntimeException(单例模式禁止通过反射创建多个实例); } isInstantiated true; } System.out.println(ReflectionProofSingleton 实例被创建); } public static ReflectionProofSingleton getInstance() { if (instance null) { synchronized (ReflectionProofSingleton.class) { if (instance null) { instance new ReflectionProofSingleton(); } } } return instance; } }5.2 防御序列化攻击如果一个单例类实现了Serializable接口反序列化时会创建新的对象。可以通过实现readResolve()方法来防止。// 文件路径singleton/SerializationProofSingleton.java import java.io.Serializable; public class SerializationProofSingleton implements Serializable { private static final long serialVersionUID 1L; private static final SerializationProofSingleton INSTANCE new SerializationProofSingleton(); private SerializationProofSingleton() { System.out.println(SerializationProofSingleton 实例被创建); } public static SerializationProofSingleton getInstance() { return INSTANCE; } // 关键方法在反序列化时返回已有的唯一实例 protected Object readResolve() { return INSTANCE; } }结论如果你需要应对这些极端情况枚举单例是最省心、最安全的选择。6. 在 Spring 框架中理解“单例”这是很多人的困惑点。Spring 容器管理的 Bean 默认作用域是singleton但它和设计模式中的单例有重要区别特性设计模式单例 (Singleton Pattern)Spring 单例 Bean (Singleton Scope)作用范围JVM 级别一个 ClassLoader 内唯一。Spring IoC 容器级别一个容器内唯一。创建时机由类加载机制或第一次访问时控制。容器启动时饿汉或第一次请求时懒汉通过Lazy配置创建。线程安全需要开发者自己保证。Bean 本身通常是无状态的容器不保证有状态 Bean 的线程安全。实现方式私有构造、静态变量等。由 Spring 容器通过反射创建并管理生命周期。目的控制实例数量提供全局访问点。管理对象生命周期实现依赖注入和控制反转。核心区别设计模式的单例是代码层面的强制约束而 Spring 的单例是容器层面的管理策略。在 Spring 中你可以通过Scope(prototype)轻松获得多例 Bean但这在设计模式中需要大幅修改代码。最佳实践在 Spring 项目中对于需要全局唯一服务如配置、工具类可以将其注册为 Spring Bean单例作用域并利用Autowired进行依赖注入这比手动实现一个设计模式单例更符合 Spring 哲学也更容易测试。7. 不同语言下的单例实践7.1 Python 的单例实现Python 有多种方式实现单例除了上述的类实现还有利用模块、元类 (__call__)、装饰器等方式。模块是 Python 中最自然、最常用的“单例”。# 文件路径singleton/singleton_module.py # 模块本身就是单例Python 只会导入一次。 _singleton_instance None def get_instance(): global _singleton_instance if _singleton_instance is None: _singleton_instance _Singleton() return _singleton_instance class _Singleton: def __init__(self): print(_Singleton 实例被创建) def do_something(self): print(Doing something in Python module singleton) # 使用from singleton_module import get_instance # instance get_instance()7.2 C/Qt 中的单例在 Qt 中实现单例需要注意父子对象的内存管理。一个常见的 Qt 风格单例如下// 文件路径singleton/QtSingleton.h #pragma once #include QObject #include QScopedPointer #include QMutex #include QMutexLocker class QtSingleton : public QObject { Q_OBJECT public: static QtSingleton instance() { static QMutex mutex; QMutexLocker locker(mutex); static QScopedPointerQtSingleton instance(new QtSingleton()); return *instance; } void doSomething() { qDebug() QtSingleton is working...; } private: explicit QtSingleton(QObject *parent nullptr) : QObject(parent) { qDebug() QtSingleton 实例被创建; } ~QtSingleton() default; Q_DISABLE_COPY(QtSingleton) };要点使用QScopedPointer管理内存使用QMutex保证线程安全C11 后也可用std::call_once使用Q_DISABLE_COPY宏禁止拷贝。8. 常见问题与排查思路问题现象可能原因排查方式解决方案多线程环境下创建了多个实例单例实现非线程安全如基础懒汉式。编写多线程测试代码多次并发调用getInstance()检查实例哈希值或创建日志。改用线程安全的实现如 DCL加volatile、静态内部类或枚举。序列化/反序列化后得到不同实例单例类实现了Serializable但未定义readResolve()方法。对实例进行序列化再反序列化比较对象是否相等 ()。实现readResolve()方法并返回唯一实例。或直接使用枚举单例。通过反射创建了新实例构造函数未做防御。使用反射 API 尝试获取私有构造函数并创建新实例。在构造函数中添加标志位检查并抛出异常。或使用枚举单例。在分布式系统或集群中“单例”不唯一单例作用域是 JVM/进程级别多个 JVM/进程各自有实例。理解单例模式的作用域限制。需要使用分布式锁、集中式配置中心如 Redis、ZooKeeper或数据库唯一约束来实现集群级别的“单例”。Spring 中Autowired的单例 Bean 状态混乱Bean 本身是有状态的且被多线程共享。检查 Bean 中是否有非线程安全的成员变量如SimpleDateFormat。将 Bean 设计为无状态的或将有状态变量改为局部变量或使用ThreadLocal。9. 最佳实践与工程建议优先考虑“无单例”在引入单例前先问自己是否真的需要全局唯一实例。依赖注入如 Spring通常是更好的选择它能降低耦合提高可测试性。Java 首选枚举或静态内部类对于大多数 Java 项目如果不需要延迟初始化参数枚举单例是最安全、最简洁的选择。如果需要懒加载且非枚举静态内部类是优选。明确单例的职责单例类应该职责单一避免变成“上帝对象”God Object什么都往里塞。注意线程安全与性能如果使用 DCL务必记得volatile关键字Java。在高并发场景下评估同步开销。考虑序列化和反射如果单例需要持久化或处于可能被攻击的环境必须考虑这些防御措施或者直接使用枚举。在框架中使用框架的机制在 Spring、Qt 等框架中优先使用框架提供的容器管理生命周期如 Spring 的Bean、Qt 的父子对象树而不是自己手写一个设计模式单例。良好的命名getInstance()是标准命名保持一致性。实例变量通常命名为INSTANCE(枚举) 或instance。单元测试虽然单例全局唯一对测试不友好但可以通过将单例抽象为接口并使用依赖注入在测试时替换为 Mock 对象来保证代码的可测试性。单例模式是一个经典的起点但它更像是一面镜子映照出你对线程安全、内存模型、类加载机制、序列化、反射以及框架设计思想的理解深度。正确实现一个单例远不止于写几行代码它要求你对所在平台的特性有清晰的认知。下次当你下意识地想写一个单例时不妨先停下来想想是否真的有必要以及哪种实现方式最适合当前的技术栈和项目阶段。

相关新闻

Anycast 任播 网络协议深入:原理、配置与排障

Anycast 任播 网络协议深入:原理、配置与排障

Anycast 任播 网络协议深入:原理、配置与排障工具地址:https://www.speedce.com 社区论坛:https://bbs.speedce.com 联系:speedceadsgmail.com写在前面 围绕「Anycast 任播」,本文提供可落地的技术指南,并在…

2026/8/25 12:05:45 阅读更多 →
mysql like也是b+Tree索引吗

mysql like也是b+Tree索引吗

like也是bTree索引吗一、直接回答 是的,当 LIKE 查询能用到索引时,用的就是 BTree 索引,因为 MySQL 中默认的索引结构就是 BTree。但关键在于 BTree 的有序性决定了什么样的 LIKE 查询能用索引。二、BTree 为什么支持 LIKE ‘abc%’&#xff…

2026/8/25 12:05:45 阅读更多 →
Live2D模型集成实战:从原理到Web与Unity跨平台部署

Live2D模型集成实战:从原理到Web与Unity跨平台部署

最近在逛一些技术社区和开源项目时,我发现一个有趣的现象:越来越多的开发者,尤其是独立游戏开发者和虚拟主播技术栈的从业者,开始热衷于将高质量的 Live2D 模型集成到自己的项目中。这背后反映的,远不止是“让角色动起…

2026/8/25 12:05:45 阅读更多 →

最新新闻

WebSocket实时通信:从协议到实现

WebSocket实时通信:从协议到实现

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍从协议到实现,涵盖核心原…

2026/8/25 12:51:13 阅读更多 →
餐饮行业为何需要独立的原材料库存管理系统?

餐饮行业为何需要独立的原材料库存管理系统?

很多餐饮老板以为收银系统自带“库存管理”就够了,实际上两者存在根本性差异: 收银系统的“库存”本质是“成品/半成品数量”——它记录的是“卖了多少份红烧肉”“还剩多少瓶可乐”,目的是前台结账和出品控制。而原材料库存管理系统管的是“…

2026/8/25 12:51:13 阅读更多 →
请求验证与统一错误处理:让API固若金汤

请求验证与统一错误处理:让API固若金汤

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍让API固若金汤,涵盖核心原…

2026/8/25 12:51:13 阅读更多 →
Swagger/OpenAPI文档自动生成:告别手写API文档

Swagger/OpenAPI文档自动生成:告别手写API文档

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍告别手写API文档,涵盖核心…

2026/8/25 12:51:13 阅读更多 →
Go gRPC实战(二) 服务端开发与四种服务方法

Go gRPC实战(二) 服务端开发与四种服务方法

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍Go gRPC实战(二) 服务端开…

2026/8/25 12:51:12 阅读更多 →
能写的未必能过检:从AIGC检测原理倒推,论文AI工具到底该怎么选

能写的未必能过检:从AIGC检测原理倒推,论文AI工具到底该怎么选

去年这个时候,我正在实验室帮师妹改她的硕士论文初稿。她把一段自己用通用大模型生成的文献综述贴给我,句子通顺得无可挑剔,但读三段就觉得“太顺了”:每段都是先定义、再转折、最后总结,专业术语堆得很整齐&#xff0…

2026/8/25 12:50:12 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →