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

零基础设计模式——创建型模式 - 单例模式

第二部分:创建型模式 - 单例模式 (Singleton Pattern)

欢迎来到创建型模式的第一站——单例模式!这是最简单也最常用的设计模式之一。

  • 核心思想:关注对象的创建过程,将对象的创建与使用分离,降低系统的耦合度。

单例模式 (Singleton Pattern)

“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

想象一下,你们班只有一个班长,或者你们学校只有一个校长。无论什么时候提到“我们班班长”或“我们学校校长”,指的都是同一个人。这个人就是“单例”。

1. 目的 (Intent)

单例模式的核心目的就两个:

  1. 保证唯一实例:确保一个类在任何情况下都只有一个对象实例存在。就像一个国家只有一个现任总统。
  2. 提供全局访问点:提供一个统一的方法,让程序的任何地方都可以方便地获取到这个唯一的实例。就像你可以通过“总统办公室”这个统一的渠道去联系总统。

2. 生活中的例子 (Real-world Analogy)

  • 身份证号码:每个人在中国只有一个唯一的身份证号码。这个号码全局唯一,代表了你这个人。
  • 电脑的回收站/垃圾桶:通常一台电脑只有一个回收站。你删除的文件都会进入这个唯一的回收站。
  • 打印机后台服务 (Print Spooler):当你点击打印时,打印任务会进入一个打印队列,由一个后台服务程序统一管理。这个服务程序通常是单例的,确保所有打印任务有序进行,不会因为多个程序同时直接控制打印机而造成混乱。
  • 皇帝:在一个封建王朝,通常只有一个皇帝。他是国家的最高统治者,独一无二。
  • 应用程序的配置管理器:一个应用程序通常只需要一份配置信息。这个配置管理器对象就可以设计成单例,确保所有模块读取到的配置都是一致的。
  • 日志对象 (Logger):在一个应用中,通常也只需要一个日志记录器,将所有日志信息汇总到同一个地方。

3. 适用场景 (When to Use)

什么时候应该考虑使用单例模式呢?

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时(虽然这点在实践中较少直接通过单例实现,更多的是结合其他模式)。
  • 资源共享与控制:比如数据库连接池、线程池。这些资源通常是有限的,通过单例模式可以统一管理和分配,避免资源浪费或冲突。
  • 全局状态管理:比如应用的配置信息、全局计数器等。
  • 工具类:如果一个工具类没有状态(即其方法不依赖于实例变量),并且需要频繁创建和销毁其实例会造成不必要的开销,可以考虑将其设计为单例(尽管对于无状态工具类,静态方法通常更简单)。

4. 优缺点 (Pros and Cons)

优点:

  1. 保证实例唯一:这是核心优点,确保了对象在内存中只有一个副本,节约了系统资源。
  2. 全局访问:提供了一个方便的全局访问点。
  3. 延迟实例化 (Lazy Initialization):可以在第一次被请求时才创建实例,如果未使用,则不创建,节约资源(特指懒汉式实现)。

缺点:

  1. 违反单一职责原则:单例类既要负责自身的业务逻辑,又要负责保证自身实例的唯一性,承担了过多的职责。
  2. 扩展困难:通常单例类的构造函数是私有的,这使得它很难被继承和扩展。如果想创建子类实例,会比较麻烦。
  3. 对测试不友好:如果单例依赖于外部资源(如数据库、文件),那么在单元测试时很难模拟或替换这个单例,导致测试困难。
  4. 可能被滥用:由于其简单易用,容易被滥用,导致代码中出现过多的全局状态,增加模块间的耦合度。
  5. 并发问题:在多线程环境下,懒汉式单例的创建需要特别注意线程安全问题,否则可能创建出多个实例。

5. 实现方式 (Implementations)

单例模式的实现方式有很多种,主要分为“饿汉式”和“懒汉式”。

饿汉式 (Eager Initialization)

特点:类加载时就立即创建实例,不管你用不用,它都在那里。线程安全。

生活例子:你开了一家餐馆,不管有没有客人来,你每天早上开门前就把招牌菜“红烧肉”做好一份备着。客人点餐时直接端上去。

Golang 实现 (饿汉式)
package singletonimport "fmt"// ConfigManager 配置管理器 (饿汉式)
type ConfigManager struct {settings map[string]string
}var instance = &ConfigManager{ // 类加载时就初始化settings: make(map[string]string),
}// GetInstance 获取唯一实例
func GetInstance() *ConfigManager {return instance
}func (cm *ConfigManager) Set(key, value string) {cm.settings[key] = value
}func (cm *ConfigManager) Get(key string) (string, bool) {val, ok := cm.settings[key]return val, ok
}// main.go (示例用法)
/*
package mainimport ("fmt""./singleton" // 假设 singleton 包在当前目录下
)func main() {cm1 := singleton.GetInstance()cm1.Set("appName", "My Awesome App")cm2 := singleton.GetInstance()appName, _ := cm2.Get("appName")fmt.Println("App Name:", appName) // 输出: App Name: My Awesome Appfmt.Println(cm1 == cm2) // 输出: true
}
*/
Java 实现 (饿汉式)
package com.example.singleton;import java.util.HashMap;
import java.util.Map;// ConfigManager 配置管理器 (饿汉式)
public class ConfigManagerEager {// 1. 私有静态实例,在类加载时就创建private static final ConfigManagerEager instance = new ConfigManagerEager();private Map<String, String> settings;// 2. 私有构造方法,防止外部通过 new 创建实例private ConfigManagerEager() {settings = new HashMap<>();System.out.println("饿汉式 ConfigManager 已创建.");}// 3. 公有静态方法,返回唯一实例public static ConfigManagerEager getInstance() {return instance;}public void set(String key, String value) {settings.put(key, value);}public String get(String key) {return settings.get(key);}// Main.java (示例用法)/*public static void main(String[] args) {ConfigManagerEager cm1 = ConfigManagerEager.getInstance();cm1.set("databaseUrl", "jdbc:mysql://localhost:3306/mydb");ConfigManagerEager cm2 = ConfigManagerEager.getInstance();String dbUrl = cm2.get("databaseUrl");System.out.println("Database URL: " + dbUrl); // 输出: Database URL: jdbc:mysql://localhost:3306/mydbSystem.out.println(cm1 == cm2); // 输出: true}*/
}
懒汉式 (Lazy Initialization)

特点:第一次调用获取实例的方法时才创建实例。如果一直不调用,就不创建。需要处理多线程安全问题。

生活例子:你开了一家奶茶店。只有当客人点了“珍珠奶茶”时,你才开始现场制作这杯奶茶。没客人点,你就不做。

Golang 实现 (懒汉式 - 带锁线程安全)
package singletonimport ("fmt""sync"
)// Logger 日志记录器 (懒汉式 - 线程安全)
type Logger struct {name string
}var (lazyInstance *Loggeronce         sync.Once // sync.Once 保证初始化代码只执行一次
)// GetLazyInstance 获取唯一实例 (懒汉式)
func GetLazyInstance() *Logger {once.Do(func() { // Do 方法中的函数只会被执行一次lazyInstance = &Logger{name: "GlobalLogger"}fmt.Println("懒汉式 Logger 已创建.")})return lazyInstance
}func (l *Logger) Log(message string) {fmt.Printf("[%s]: %s\n", l.name, message)
}// main.go (示例用法)
/*
package mainimport ("fmt""./singleton""sync"
)func main() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)go func(id int) {defer wg.Done()logger := singleton.GetLazyInstance()logger.Log(fmt.Sprintf("Goroutine %d is logging", id))}(i)}wg.Wait()logger1 := singleton.GetLazyInstance()logger2 := singleton.GetLazyInstance()fmt.Println(logger1 == logger2) // 输出: true (如果之前有goroutine执行过,则不会再打印创建信息)
}
*/

说明:在Go中,sync.Once 是实现线程安全的懒汉式单例的最佳方式。它能确保即使在多个goroutine并发调用GetLazyInstance时,初始化代码(创建实例的那部分)也只会被执行一次。

Java 实现 (懒汉式 - 双重校验锁 DCL - 线程安全)
package com.example.singleton;// Logger 日志记录器 (懒汉式 - 双重校验锁 DCL)
public class LoggerLazyDCL {// 1. 私有静态实例,volatile 保证可见性和禁止指令重排private static volatile LoggerLazyDCL instance;private String name;// 2. 私有构造方法private LoggerLazyDCL(String name) {this.name = name;System.out.println("懒汉式 Logger (DCL) 已创建: " + name);}// 3. 公有静态方法,返回唯一实例 (双重校验锁)public static LoggerLazyDCL getInstance(String name) {if (instance == null) { // 第一次检查,不加锁,提高性能synchronized (LoggerLazyDCL.class) { // 加类锁if (instance == null) { // 第二次检查,防止多个线程同时通过第一次检查instance = new LoggerLazyDCL(name);}}}return instance;}public void log(String message) {System.out.println("[" + this.name + "]: " + message);}// Main.java (示例用法)/*public static void main(String[] args) {Thread t1 = new Thread(() -> {LoggerLazyDCL logger = LoggerLazyDCL.getInstance("AppLogger");logger.log("Thread 1 logging");});Thread t2 = new Thread(() -> {LoggerLazyDCL logger = LoggerLazyDCL.getInstance("AppLogger"); // 即使传入不同name,也只会创建一次logger.log("Thread 2 logging");});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}LoggerLazyDCL logger1 = LoggerLazyDCL.getInstance("AppLogger");LoggerLazyDCL logger2 = LoggerLazyDCL.getInstance("AnotherLoggerName");System.out.println(logger1 == logger2); // 输出: true}*/
}

Java DCL (Double-Checked Locking) 注意事项:

  • instance 变量必须用 volatile 修饰。这是因为 instance = new LoggerLazyDCL(name); 这行代码并非原子操作,它大致可以分为三步:
    1. instance 分配内存空间。
    2. 初始化 LoggerLazyDCL 对象。
    3. instance 引用指向分配的内存地址。
      JVM 可能会进行指令重排序,导致步骤 2 和 3 的顺序颠倒。如果一个线程执行了 1 和 3,但还没执行 2,此时另一个线程进来,发现 instance 不为 null,就会直接返回一个未完全初始化的对象,从而引发问题。volatile 可以禁止这种指令重排,并保证多线程间的可见性。
其他实现方式 (Java 特有)
  • 静态内部类 (Static Inner Class):利用了类加载机制来保证线程安全和延迟加载,是Java中推荐的懒汉式实现。

    package com.example.singleton;public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {System.out.println("静态内部类单例已创建.");}private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}public void showMessage(){System.out.println("Hello from Static Inner Class Singleton!");}// Main.java (示例用法)/*public static void main(String[] args) {StaticInnerClassSingleton s1 = StaticInnerClassSingleton.getInstance();StaticInnerClassSingleton s2 = StaticInnerClassSingleton.getInstance();s1.showMessage();System.out.println(s1 == s2); // true}*/
    }
    

    原理:当 StaticInnerClassSingleton 类加载时,静态内部类 SingletonHolder 不会立即被加载。只有当第一次调用 getInstance() 方法时,才会触发 SingletonHolder 的加载,此时静态变量 INSTANCE 才会被初始化,并且由JVM保证线程安全。

  • 枚举 (Enum):最简洁、最安全(天然防止反射和反序列化破坏单例)的实现方式,由《Effective Java》作者 Joshua Bloch 推荐。

    package com.example.singleton;public enum EnumSingleton {INSTANCE;private EnumSingleton() {System.out.println("枚举单例已创建.");}public void showMessage(){System.out.println("Hello from Enum Singleton!");}// Main.java (示例用法)/*public static void main(String[] args) {EnumSingleton s1 = EnumSingleton.INSTANCE;EnumSingleton s2 = EnumSingleton.INSTANCE;s1.showMessage();System.out.println(s1 == s2); // true}*/
    }
    

6. 总结

单例模式是一种简单但功能强大的模式,用于确保类只有一个实例并提供全局访问点。选择哪种实现方式取决于具体需求:

  • 饿汉式:简单,线程安全,但可能造成资源浪费(如果实例一直不用)。
  • 懒汉式 (Go sync.Once):线程安全,延迟加载,Go语言推荐。
  • 懒汉式 (Java DCL):线程安全,延迟加载,但实现略复杂,需要注意 volatile
  • 静态内部类 (Java):线程安全,延迟加载,实现优雅,Java中常用。
  • 枚举 (Java):最简洁、最安全的实现方式,能防止反射和反序列化攻击,Java中极力推荐。

理解单例模式是学习其他设计模式的基础。记住它的核心思想:唯一全局访问

相关文章:

零基础设计模式——创建型模式 - 单例模式

第二部分&#xff1a;创建型模式 - 单例模式 (Singleton Pattern) 欢迎来到创建型模式的第一站——单例模式&#xff01;这是最简单也最常用的设计模式之一。 核心思想&#xff1a;关注对象的创建过程&#xff0c;将对象的创建与使用分离&#xff0c;降低系统的耦合度。 单例…...

数据挖掘:从数据堆里“淘金”,你的数据价值被挖掘了吗?

数据挖掘&#xff1a;从数据堆里“淘金”&#xff0c;你的数据价值被挖掘了吗&#xff1f; 在这个数据爆炸的时代&#xff0c;我们每天都在产生海量信息&#xff1a;社交媒体上的点赞、网购时的浏览记录&#xff0c;甚至是健身手环记录下的步数。这些数据本身可能看似杂乱无章…...

k8s1.27版本集群部署minio分布式

需求&#xff1a; 1.创建4个pv&#xff0c;一个pv一个minio-pod。使用sts动态分配pvc(根据存储类找到pv)。----持久化 2.暴露minio的9001端口。&#xff08;nodeport&#xff09;----管理界面 镜像&#xff1a;minio/minio:RELEASE.2023-03-20T20-16-18Z--->换国内源 说明…...

雷军:芯片,手机,平板,SUV一起发

大家好&#xff0c;我是小悟。 5月19日&#xff0c;雷军在微博上宣布&#xff0c;5月22日晚7点将举办小米战略新品发布会。 这场被官方称为“人车家全生态”战略升级的重要活动&#xff0c;一口气带来了小米手机SoC芯片“玄戒O1”、旗舰手机小米15S Pro、小米平板7 Ultra&…...

使用Dockerfile构建含私有Maven仓库依赖包的Java容器

背景 需要用JDBC方式访问ArgoDB星环提供了ArgoDB jar包应用将以Container的方式运行我希望打包成镜像之后&#xff0c;镜像启动就能测试连接是否成功连接URL串需要能够传递进去 失败的方案一&#xff1a;本地文件导入POM pom.xml 配置本地路径 <dependency><groupI…...

AI指令模板综述(Prompt Review)

文章目录 DeepSeek DeepSeek 参考&#xff1a;DeepSeek学术指令大全 找到有价值的研究方向 "作为我的学术研究助手&#xff0c;你需要基于以下要求为我生成5个具有学术价值的创新选题&#xff1a; 请聚焦于[具体研究领域&#xff0c;如’社交媒体用户行为’或’深度学习…...

软件架构之-论分布式架构设计及其实现

论分布式架构设计及其实现 摘要正文 摘要 2023年2月&#xff0c;本人所在集团公司承接了长三角地区某省渔船图纸电子化审查项目开发&#xff0c;该项目旨在为长三角地区渔船建造设计院、渔船审图机构提供一个便捷化的服务平台。在次项目中&#xff0c;我作为项目成员参与了整个…...

零售EDI:Belk Stores EDI需求分析

Belk Stores 成立于 1888 年&#xff0c;是美国历史最悠久的家族百货连锁品牌之一&#xff0c;总部位于北卡罗来纳州夏洛特市。作为美国东南部领先的零售企业&#xff0c;Belk 在16个州拥有近300家门店&#xff0c;主要经营服装、鞋履、美妆、家居用品等多个品类&#xff0c;服…...

LangChain4j入门(六)整合提示词(Prompt)

前言 提示词&#xff08;Prompt&#xff09;是用户输入给AI模型的一段文字或指令&#xff0c;用于引导模型生成特定类型的内容。通过提示词&#xff0c;用户可以告诉AI“做什么”、 “如何做”以及“输出格式”&#xff0c;从而在满足需求的同时最大程度减少无关信息的生成。有…...

【HarmonyOS 5】金融应用开发鸿蒙组件实践

【HarmonyOS 5】金融应用开发鸿蒙组件实践 一、鸿蒙生态观察 2024 年 1 月 18 日&#xff1a; 发布 原生鸿蒙操作系统星河版&#xff0c;面向开发者开放申请&#xff0c;余承东宣布鸿蒙生态设备数达 8 亿台&#xff1b;建设银行、邮储银行等完成鸿蒙原生应用 Beta 版本开发。 …...

cv2.VideoWriter_fourcc(*‘mp4v‘)生成的视频无法在浏览器展

看这个博主的博客&#xff0c;跟我碰到的问题的一致&#xff0c;都是使用AVC1写视频时报编码器不存在的异常&#xff0c;手动编译opencv-python或者使用conda install -c conda-forge opencv安装依赖即可。 博主博客&#xff1a;Python OpenCV生成视频无法浏览器播放问题说明及…...

MD编辑器推荐【Obsidian】含下载安装和实用教程

为什么推荐 Obsidian &#xff1f; 免费 &#xff08;Typora 开始收费了&#xff09;Typora 实现的功能&#xff0c;它都有&#xff01;代码块可一键复制 文件目录支持文件夹 大纲支持折叠、搜索 特色功能 – 白板 特色功能 – 关系图谱 下载 https://pan.baidu.com/s/1I1fSly…...

新书速览|GraphPad Prism图表可视化与统计数据分析:视频教学版

《GraphPad Prism图表可视化与统计数据分析:视频教学版 》 本书内容 《GraphPad Prism图表可视化与统计数据分析:视频教学版 》以GraphPad Prism 10为平台&#xff0c;讲述统计分析软件GraphPad Prism的具体应用方法。在介绍《GraphPad Prism图表可视化与统计数据分析:视频教学…...

波峰波谷策略

这是一个基于数据分布的峰度(kurtosis)和偏度(skewness)的交易策略。 当数据呈现趋势性,并且潜在趋势为正时,我们做多。 当数据呈现趋势性,并且潜在趋势为负时,我们做空。 当趋势发生反转后,我们平仓。 那么,我们如何确定趋势和趋势的强度呢?让我们先来复习一下峰…...

【综述】视频目标分割VOS

目录 1、Associating Objects with Transformers for Video Object Segmentation1&#xff09;背景知识2&#xff09;研究方法3&#xff09;实验结果4&#xff09;结论 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentat…...

基于线性回归的数据预测

1. 自主选择一个公开回归任务数据集&#xff08;如房价预测、医疗数据、空气质量预测等&#xff0c;可Kaggle&#xff09;。 2. 数据预处理&#xff1a;完成标准化&#xff08;Normalization&#xff09;、特征选择或缺失值处理等步骤。 3. 使用线性回归模型进行建模。采用80…...

第5天-python饼图绘制

一、基础饼图绘制(Matplotlib) 1. 环境准备 python 复制 下载 pip install matplotlib numpy 2. 基础饼图代码 python 复制 下载 import matplotlib.pyplot as plt# 数据准备 labels = [1, 2, 3, 4] sizes = [30, 25, 15, 30] # 各部分占比(总和建议100) colors…...

c++学习方向选择说明

文章目录 前言一、什么样的人适合用c找编程相关工作二、c可以投递什么岗位三、应届生c怎么学才可以找到好工作那这样的话&#xff0c;校招生搞c应该怎么学才能凸显自己的优势呢&#xff1f;那有人就问了&#xff0c;那我应该学啥啊&#xff1f; 四、零基础学习c路线 前言 做了…...

采集需要登录网站的教程

有些网站需要用户登录才能显示相关信息&#xff0c;如果要采集这类网站&#xff0c;有以下几个方法&#xff1a; 1. 写发布模块来抓包获取post的数据&#xff1b; 2. 有些采集器内置浏览器获取这些信息&#xff0c;但是经常获取的不准确&#xff0c;可靠性太低&#xff1b; 3. …...

在hadoop中实现序列化与反序列化

在 Hadoop 分布式计算环境中&#xff0c;序列化与反序列化是数据处理的核心机制之一。由于 Hadoop 需要在集群节点间高效传输数据并进行分布式计算&#xff0c;其序列化框架不仅要支持对象的序列化与反序列化&#xff0c;还要满足高效、紧凑、可扩展等特殊需求。本文将深入探讨…...

数据结构*排序

排序的一些相关概念 稳定性 假设在待排序序列中&#xff0c;存在两个元素A和B&#xff0c;A和B的值相同。在排序后&#xff0c;A和B的相对位置没有变化&#xff0c;就说这排序是稳定的。反之不稳定。 内部排序与外部排序 内部排序&#xff1a;数据完全存储在内存中&#xf…...

新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式

5月14日&#xff0c;新浪网《经济新闻》频道专题报道珈和科技在第十四届四川国际茶业博览会上的精彩亮相&#xff0c;并深度聚焦我司以数字技术赋能川茶产业高质量发展创新技术路径&#xff0c;及在成都市“茶业建圈强链”主题推介会上&#xff0c;珈和科技与蒲江县人民政府就智…...

【Linux】第二十三章 控制启动过程

1. 请简要说明 RHEL9的启动过程。 &#xff08;1&#xff09;计算机通电。系统固件 (UEFI 或 BIOS) 开机自检 (POST)&#xff0c;并初始化部分硬件&#xff0c;然后&#xff0c;固件会寻找启动设备&#xff08;如硬盘、USB、网络等&#xff09;&#xff0c;并将控制权交给引导…...

深信服golang面经

for range 中赋值的变量&#xff0c;这个变量指向的是真实的地址吗&#xff0c;还是临时变量 不是真实地址&#xff0c;是临时变量 package mainimport "fmt"func main() {slice : []int{4, 2, 3}for _, v : range slice {fmt.Println(v, &v) // 这里的 v 是临…...

基于 Netty + SpringBoot + Vue 的高并发实时聊天系统设计与实现

一、系统架构设计 1.1 整体架构图 ------------------ WebSocket (wss) ------------------ Netty TCP ------------------ | Vue前端 | <-------------------------> | SpringBoot网关 | <------------------> | Netty服务集…...

根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能

代码如下&#xff1a; <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"开始月份" end-placeholder"结束月份" :picker-options"pic…...

Spring Boot 使用 jasypt配置明文密码加密

引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version> </dependency>添加配置 jasypt:encryptor:password: pssw0rd&Hubt2ec…...

ubuntu下docker安装mongodb-支持单副本集

1.mogodb支持事务的前提 1) MongoDB 版本&#xff1a;确保 MongoDB 版本大于或等于 4.0&#xff0c;因为事务支持是在 4.0 版本中引入的。 2) 副本集配置&#xff1a;MongoDB 必须以副本集&#xff08;Replica Set&#xff09;模式运行&#xff0c;即使是单节点副本集&#x…...

科技赋能,开启现代健康养生新潮流

在科技与生活深度融合的当下&#xff0c;健康养生也迎来了全新的打开方式。无需传统医学的介入&#xff0c;借助现代科学与智能设备&#xff0c;我们能以更高效、精准的方式守护健康。​ 饮食管理步入精准化时代。利用手机上的营养计算 APP&#xff0c;录入每日饮食&#xff0…...

《安徽日报》聚焦珈和科技AI创新:智慧虫情测报护航夏粮提质丰产

5月7日&#xff0c;《安徽日报》焦点新闻版块以《高科技助力田管&#xff0c;确保夏粮丰收——为4300多万亩小麦守好防线》为题&#xff0c;深度报道了农业科技在夏粮生产中的关键作用。其中&#xff0c;珈和科技自主研发的AI虫情测报一体机作为绿色防控、农业智慧化的标杆被重…...

企业级 Go 多版本环境部署指南-Ubuntu CentOS Rocky全兼容实践20250520

&#x1f6e0;️ 企业级 Go 多版本环境部署指南-Ubuntu / CentOS / Rocky 全兼容实践 兼顾 多版本管理、安全合规、最小权限原则与 CI/CD 可复现性&#xff0c;本指南以 Go 官方 toolchain 为主&#xff0c;结合 asdf 实现跨语言统一管理&#xff0c;并剔除已过时的 GVM。支持 …...

MCP 协议传输机制大变身:抛弃 SSE,投入 Streamable HTTP 的怀抱

在技术的江湖里&#xff0c;变革的浪潮总是一波接着一波。最近&#xff0c;模型上下文协议&#xff08;MCP&#xff09;的传输机制就搞出了大动静&#xff0c;决定和传统的服务器发送事件&#xff08;SSE&#xff09;说拜拜&#xff0c;转身拥抱 Streamable HTTP&#xff0c;这…...

Windows 上配置 Docker,Docker 的基本原理和用途,以及如何在 Docker 中运行程序

Windows 系统上的 Docker 安装与使用指南 1. Windows 上配置 Docker 检查系统要求&#xff1a;使用 64 位 Windows 10/11&#xff0c;BIOS 已启用硬件虚拟化&#xff08;VT-x/AMD-V&#xff09;。Windows 版本最好更新到 2004 及以上&#xff08;内部版本19041&#xff09;&am…...

CBCharacteristic:是「特征」还是「数据通道」?

目录 名词困惑&#xff1a;两种中文译法的由来官方定义 & 开发者视角乐高类比&#xff1a;文件夹与文件智能手表实例&#xff1a;Characteristic 长什么样&#xff1f;iOS 代码实战&#xff1a;读 / 写 / 订阅小结 & Best Practice 1. 名词困惑&#xff1a;为什么有两…...

【JavaEE】多线程

线程 在Java中&#xff0c;鼓励多线程编程。进程可以满足并发编程&#xff0c;但是效率不高&#xff08;创建、销毁、调度时间都比较长&#xff0c;这些都消耗在申请资源上了&#xff09;&#xff0c;而线程就不一样。 线程也叫“轻量级进程”&#xff0c;创建、销毁、调度都更…...

docker- Harbor 配置 HTTPS 协议的私有镜像仓库

Harbor通过配置 HTTPS 协议&#xff0c;可以确保镜像传输的安全性&#xff0c;防止数据被窃取或篡改。本文将详细介绍如何基于 Harbor 配置 HTTPS 协议的私有镜像仓库。 1.生成自建ca证书 [rootdocker01 ~]# mkdir -p /liux/softwares/harbor/certs/custom/{ca,server,client…...

[SpringBoot]Spring MVC(5.0)----留言板

Spring留言板实现 预期结果 可以发布并显示点击提交后&#xff0c;显示并清除输入框并且再次刷新后&#xff0c;不会清除下面的缓存 约定前后端交互接口 Ⅰ 发布留言 url : /message/publish . param(参数) : from,to,say . return : true / false . Ⅱ 查询留言 url : /messag…...

Jules 从私有预览阶段推向全球公测

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

vLLM框架高效原因分析

vLLM框架在模型推理中以高效出名&#xff0c;主要基于以下核心原理和技术优化&#xff0c;这些设计使其在处理大语言模型时显著提升性能&#xff1a; 一、PagedAttention&#xff1a;动态显存管理技术 vLLM的核心创新在于PagedAttention&#xff0c;灵感源自操作系统的虚拟内存…...

【Git】常用命令大全

以下是 Git 的常用命令大全&#xff0c;分为几个常见类别&#xff0c;便于理解和使用&#xff1a; 1. 初始化与克隆 初始化本地仓库&#xff1a;git init克隆远程仓库到本地&#xff1a;git clone <repository_url> 2. 添加与提交 添加指定文件到暂存区&#xff1a;git…...

pycharm无需科学上网工具下载插件的解决方案

以下是两种无需科学上网即可下载 PyCharm 插件的解决思路&#xff1a; 方法 1&#xff1a;设置 PyCharm 代理 打开 PyCharm选择菜单&#xff1a;File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理设置中进行如下配置&#xff1a; 代理地…...

学习threejs,使用Physijs物理引擎,使用DOFConstraint自由度约束,模拟小车移动

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

仓颉开发语言入门教程:常见UI组件介绍和一些问题踩坑

幽蓝君发现一个问题&#xff0c;仓颉开发语言距离发布马上一年了&#xff0c;一些知名App已经使用仓颉开发了许多功能&#xff0c;但是网络上关于仓颉开发语言的教程少之又少&#xff0c;系统性的教程更是没有&#xff0c;仓颉官网的文档也远远不如ArkTS详尽。 现阶段对于想学…...

[Git] 初识 Git 与安装入门

告别文件噩梦&#xff1a;初识 Git 与安装入门 嘿&#xff0c;朋友&#xff01;不知道你是不是也遇到过这样的情况&#xff1a;你在写一份重要的文档、报告&#xff0c;或者更常见的&#xff0c;一段代码时&#xff0c;为了安全起见&#xff0c;怕改错了回不去&#xff0c;或者…...

海康威视摄像头C#开发指南:从SDK对接到安全增强与高并发优化

一、海康威视SDK核心对接流程​​ 1. ​​开发环境准备​​ ​​官方SDK获取​​&#xff1a;从海康开放平台下载最新版SDK&#xff08;如HCNetSDK.dll、PlayCtrl.dll&#xff09;。​​依赖项安装​​&#xff1a;确保C运行库&#xff08;如vcredist_x86.exe&#xff09;与S…...

大语言模型 14 - Manus 超强智能体 开源版本 OpenManus 上手指南

写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体&#xff08;AI Agent&#xff09;&#xff0c;旨在实现“知行合一”&#xff0c;即不仅具备强大的语言理解和推理能力&#xff0c;还能自主执行复杂任务&#xff0c;直接交付完整成…...

使用 LibreOffice 实现各种文档格式转换(支持任何开发语言调用 和 Linux + Windows 环境)[全网首发,保姆级教程,建议收藏]

以下能帮助你可以使用任何开发语言&#xff0c;在任何平台都能使用 LibreOffice 实现 Word、Excel、PPT 等文档的自动转换&#xff0c;目前展示在 ASP.NET Core 中为 PDF的实战案例&#xff0c;其他的文档格式转换逻辑同理。 &#x1f4e6; 1. 安装 LibreOffice &#x1f427;…...

CentOS Stream 9 中部署 MySQL 8.0 MGR(MySQL Group Replication)一主两从高可用集群

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《MySQL技术精粹》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、MySQL 8.0 中的高可用方案 2、适用场景 二、环境准备 1、系统环境说明…...

软考中级软件设计师——计算机网络篇

一、计算机网络体系结构 1.OSI七层模型 1. 物理层&#xff08;Physical Layer&#xff09; 功能&#xff1a;传输原始比特流&#xff08;0和1&#xff09;&#xff0c;定义物理介质&#xff08;如电缆、光纤&#xff09;的电气、机械特性。 关键设备&#xff1a;中继器&#…...

RK3568 OH5.1 源码编译及问题

安装编译器和二进制工具 在源码根目录下执行prebuilts脚本&#xff0c;安装编译器及二进制工具。 bash build/prebuilts_download.sh在源码根目录执行如下指令安装hb编译工具&#xff1a; python3 -m pip install --user build/hb使用build.sh脚本编译源码 进入源码根目录&…...