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

深入理解 Java 单例模式:从基础到最佳实践

单例(Singleton)模式是 Java 中最基本、最常用的设计模式之一。它确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个唯一的实例。

一、为什么需要单例模式?(使用场景)

单例模式主要适用于以下场景:

  1. 资源共享与控制访问:当实例需要共享资源(如数据库连接池、线程池、配置文件、日志对象)或者需要控制对共享资源的并发访问时,单例可以确保所有操作都通过这唯一的实例进行。
  2. 确保唯一实例:某些类在逻辑上只需要一个实例,例如代表应用程序配置的对象、硬件设备管理器等。多实例可能会导致状态不一致或资源冲突。
  3. 懒加载(Lazy Loading):在某些情况下,实例的创建可能比较耗费资源。如果该实例并非立即需要,可以通过懒加载的方式,在首次使用时才创建,从而减少程序启动时的资源消耗。

二、实现单例模式的核心要求

一个标准的单例模式通常包含以下三个要素:

  1. 私有的构造函数:防止外部代码通过 new​ 关键字直接创建类的实例。
  2. 私有的静态实例变量:在类的内部持有该类的唯一实例。
  3. 公有的静态方法:提供一个全局访问点(通常命名为 getInstance()​),用于获取类的唯一实例。

三、常见的单例实现方式

1. 饿汉式(Eager Initialization)

饿汉式在类加载时就直接创建实例,不管后续是否真的用到。

/*** 饿汉式单例* 优点:实现简单,线程安全(由JVM类加载机制保证)* 缺点:非懒加载,可能造成资源浪费*/
public class EagerSingleton {// 1. 私有静态final实例变量,在类加载时就初始化private static final EagerSingleton instance = new EagerSingleton();// 2. 私有构造方法private EagerSingleton() {// 防止外部实例化System.out.println("EagerSingleton instance created.");}// 3. 公有静态方法返回实例public static EagerSingleton getInstance() {return instance;}public void doSomething() {System.out.println("EagerSingleton is doing something.");}
}

核心思想:利用 JVM 的类加载机制保证实例创建的线程安全。当类被加载时,静态变量 instance​ 会被初始化,这个过程由 JVM 保证只执行一次。

关键点:

  • 线程安全:天然线程安全,无需额外加锁。
  • 非懒加载:实例在类加载时创建,即使从未调用 getInstance()​。
2. 懒汉式(Lazy Initialization)

懒汉式在首次调用获取实例的方法时才创建实例。需要特别注意线程安全问题。

方式一:简单同步方法(性能较低)

/*** 懒汉式单例 - 同步方法* 优点:懒加载* 缺点:线程安全但性能低(每次调用getInstance都有同步开销)*/
public class LazySingletonSynchronized {private static LazySingletonSynchronized instance;private LazySingletonSynchronized() {System.out.println("LazySingletonSynchronized instance created.");}// 使用synchronized保证线程安全,但锁定了整个方法public static synchronized LazySingletonSynchronized getInstance() {if (instance == null) {instance = new LazySingletonSynchronized();}return instance;}
}

方式二:双重校验锁(Double-Checked Locking, DCL)

为了提高性能,避免每次调用 getInstance()​ 都进行同步。

/*** 懒汉式单例 - 双重校验锁 (DCL)* 优点:懒加载,线程安全,性能相对较高* 缺点:实现复杂,需要volatile关键字防止指令重排序*/
public class LazySingletonDCL {// 1. 使用volatile关键字确保可见性和禁止指令重排序private static volatile LazySingletonDCL instance;private LazySingletonDCL() {System.out.println("LazySingletonDCL instance created.");}public static LazySingletonDCL getInstance() {// 第一次检查,避免不必要的同步if (instance == null) {// 同步块,保证只有一个线程创建实例synchronized (LazySingletonDCL.class) {// 第二次检查,防止多个线程重复创建if (instance == null) {// new操作非原子,volatile防止指令重排序问题instance = new LazySingletonDCL();}}}return instance;}
}

DCL 中 volatile​ 的重要性:
​instance = new LazySingletonDCL();​ 不是原子操作,可能分为三步:

  1. 分配内存空间。
  2. 初始化对象。
  3. 将 instance​ 指向分配的内存地址。
    JVM 可能进行指令重排序(如 1 -> 3 -> 2)。若无 volatile​,线程 A 执行 1 和 3 后,instance​ 非空但未初始化。线程 B 此时调用 getInstance()​,会跳过同步块直接返回未初始化的 instance​,导致错误。volatile​ 可禁止这种重排序并保证内存可见性。

方式三:静态内部类(推荐的懒汉式)

利用 JVM 类加载机制实现懒加载和线程安全,代码更简洁。

/*** 懒汉式单例 - 静态内部类* 优点:懒加载,线程安全(由JVM保证),实现简单*/
public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {System.out.println("StaticInnerClassSingleton instance created.");}// 静态内部类private static class SingletonHolder {// 在内部类中持有实例,JVM保证初始化线程安全且只执行一次private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}// 调用getInstance时,才会加载SingletonHolder,从而创建INSTANCEpublic static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}

工作原理:

  • 外部类 StaticInnerClassSingleton​ 加载时,静态内部类 SingletonHolder​ 不会被加载。
  • 只有首次调用 getInstance()​ 方法访问 SingletonHolder.INSTANCE​ 时,JVM 才会加载 SingletonHolder​ 类,并初始化 INSTANCE​。
  • JVM 的类加载过程是线程安全的。

初始化时机对比:

特性静态变量(饿汉式)静态内部类(懒汉式)静态方法(懒汉同步方法/DCL)
初始化时机外部类初始化(加载)阶段首次主动使用内部类时首次主动调用 getInstance​ 时

核心:通过 JVM 类加载机制(饿汉式、静态内部类)实现的单例都是天然线程安全的,无需显式加锁。

3. 枚举式(Enum Singleton)—— 最佳实践

《Effective Java》作者 Joshua Bloch 推荐的方式,极其简洁、高效,并且天然防止反射和反序列化攻击。

/*** 枚举式单例 - 最佳实践* 优点:实现极简,线程安全,防止反射和反序列化攻击* 缺点:非传统意义上的懒加载(类加载时实例已备好,但枚举本身加载也可能延迟)*/
public enum EnumSingleton {INSTANCE; // 定义一个枚举元素,它本身就是单例实例// 可以添加业务方法public void doSomething() {System.out.println("EnumSingleton is doing something.");}// 示例用法public static void main(String[] args) {EnumSingleton s1 = EnumSingleton.INSTANCE;EnumSingleton s2 = EnumSingleton.INSTANCE;System.out.println(s1 == s2); // 输出 trues1.doSomething();}
}

为什么枚举是最佳实践?

  • 简洁性:代码量最少。
  • 线程安全:由 JVM 保证,无需担心。
  • 防止反序列化创建新实例:Java 枚举的序列化机制有特殊处理,readObject()​ 方法会直接返回已存在的枚举常量,而不是创建新对象。
  • 防止反射攻击:反射无法通过 newInstance()​ 方法创建枚举实例(会抛出异常)。
  • 避免资源浪费的误解:虽然枚举实例在类加载时就“准备好了”,但枚举类本身的加载也可能被延迟。更重要的是,枚举的设计意图明确,开发者使用时就是为了获取单例,几乎不存在“加载了但从未被调用”的浪费情况。相比之下,普通的饿汉式如果设计不当(例如被其他无关类意外触发加载),才可能造成实例创建后未被使用的浪费。JVM 对枚举也有内存优化。

四、破坏单例模式的途径及防御

1. 反射(Reflection)

反射可以通过调用私有构造函数来创建新的实例。

破坏示例(假设有 LazySingletonDCL​ 类):

Constructor<LazySingletonDCL> constructor = LazySingletonDCL.class.getDeclaredConstructor();
constructor.setAccessible(true); // 强行访问私有构造
LazySingletonDCL instance1 = LazySingletonDCL.getInstance();
LazySingletonDCL instance2 = constructor.newInstance(); // 创建新实例
System.out.println(instance1 == instance2); // 输出 false

防御:在私有构造函数中增加检查,如果实例已存在,则抛出异常。

private LazySingletonDCL() {// 防止反射创建新实例if (instance != null) {throw new RuntimeException("Singleton instance already exists. Use getInstance() method.");}System.out.println("LazySingletonDCL instance created.");
}

image

(注意:枚举天然防御反射)

2. 反序列化(Deserialization)

如果单例类实现了 Serializable​ 接口,通过反序列化 readObject()​ 方法会创建一个新的实例。

防御:在单例类中添加 readResolve()​ 方法。该方法在反序列化时被调用,如果存在,其返回值会取代 readObject()​ 返回的对象。我们让它直接返回现有的单例实例。

// 在实现了Serializable的单例类中添加:
protected Object readResolve() {return getInstance(); // 返回当前唯一的实例
}

image

(注意:枚举天然防御反序列化)

五、不使用锁实现线程安全的单例

回顾一下,以下方式无需在 getInstance()​ 中使用 synchronized​ 也能保证线程安全:

  1. 饿汉式:利用 JVM 类加载时初始化静态变量的线程安全性。
  2. 静态内部类:利用 JVM 加载内部类时初始化静态变量的线程安全性。
  3. 枚举式:由 JVM 从语言层面保证其唯一性和线程安全性。

六、示例:小明的购物车

下面是你提供的购物车示例代码,它使用了 DCL 实现单例。

import java.util.*;
import java.io.*;// 使用DCL实现的购物车单例
class ShoppingCart {// volatile 保证可见性和禁止指令重排序private static volatile ShoppingCart instance;// 注意:将购物车内容设为静态,意味着所有用户共享同一个购物车列表!// 在真实场景中,购物车通常与用户会话关联,而不是全局单例。// 但作为单例模式的演示,这里保持原样。private static List<String> productsNames = new ArrayList<>();private static List<Integer> produtsQuatities = new ArrayList<>();// 私有构造private ShoppingCart() {System.out.println("ShoppingCart instance created.");};// DCL 获取实例public static ShoppingCart getInstance() {if (instance == null) {synchronized (ShoppingCart.class) {if (instance == null) {instance = new ShoppingCart();}}}return instance;}// 添加商品到共享列表public void add(String name, int quantity) {productsNames.add(name);produtsQuatities.add(quantity);System.out.println("Added to cart: " + name + " " + quantity);}// (可以添加其他方法,如展示购物车内容等)
}public class Main {public static void main(String[] args) {// 获取唯一的购物车实例ShoppingCart cart = ShoppingCart.getInstance();Scanner sc = new Scanner(System.in);String inputLine;System.out.println("Enter product name and quantity (e.g., 'apple 5'), type 'exit' to quit:");while (sc.hasNextLine()) {inputLine = sc.nextLine();if ("exit".equalsIgnoreCase(inputLine.trim())) {break;}String[] parts = inputLine.trim().split("\\s+"); // 使用正则匹配一个或多个空格if (parts.length == 2) {String name = parts[0];try {int quantity = Integer.parseInt(parts[1]);if (quantity > 0) {// 通过单例实例添加商品cart.add(name, quantity);} else {System.out.println("Quantity must be positive.");}} catch (NumberFormatException e) {System.out.println("Invalid quantity format. Please enter a number.");}} else {System.out.println("Invalid input format. Please enter 'name quantity'.");}}sc.close();System.out.println("Exiting program.");// (可以添加展示最终购物车内容的代码)}
}

注意:这个购物车示例将商品列表设为 static​。这意味着无论程序中有多少用户(理论上,即使有多个线程调用 getInstance()​),他们操作的都是同一个商品列表。在真实应用中,购物车通常是每个用户一个实例(可能存放在 Session 中),而不是全局单例。但作为演示单例模式的例子,它展示了如何获取和使用唯一的 ShoppingCart​ 对象。

七、总结

单例模式是保证类只有一个实例的重要工具。选择哪种实现方式取决于具体需求:

  • 追求极致简洁、安全:优先选择 枚举式。
  • 需要懒加载且希望实现简单:静态内部类 是非常好的选择。
  • 需要懒加载且有历史代码或特殊性能考虑:可以使用 DCL,但务必确保 volatile​ 的正确使用。
  • 不介意非懒加载或实例创建成本低:饿汉式 最简单直接。


相关文章:

深入理解 Java 单例模式:从基础到最佳实践

单例&#xff08;Singleton&#xff09;模式是 Java 中最基本、最常用的设计模式之一。它确保一个类在任何情况下都只有一个实例&#xff0c;并提供一个全局访问点来获取这个唯一的实例。 一、为什么需要单例模式&#xff1f;&#xff08;使用场景&#xff09; 单例模式主要适…...

Rust:安全与性能兼得的现代系统编程语言

一、起源与设计理念 Rust 是由 Mozilla 研究院 Graydon Hoare 于 2006 年发起设计的系统级编程语言&#xff0c;其诞生源于传统系统语言&#xff08;如 C/C&#xff09;在内存安全与并发编程方面的缺陷。经过近十年的迭代&#xff0c;Rust 1.0 稳定版于 2015 年正式发布&#…...

AI赋能智慧医疗新范式:小天互连即时通讯打造高效、安全的医疗通讯平台

在医疗行业&#xff0c;高效的信息协作与严格的数据安全不仅直接关系患者诊疗效率&#xff0c;更是医院现代化管理的核心命题。小天互连即时通讯系统通过将智能化功能与医疗场景深度结合&#xff0c;打造出全链路数字化协作平台&#xff0c;有效破解了传统沟通模式的效率瓶颈&a…...

图像生成新势力:GPT-Image-1 与 GPT-4o 在智创聚合 API 的较量

在人工智能领域&#xff0c;图像生成技术正迅速发展&#xff0c;OpenAI 推出的 GPT-Image-1 和 GPT-4o 在图像生成方面展现出了强大的能力。智创聚合 API 平台已支持这两个模型&#xff0c;并且其图片生成 / 编辑工作台支持图片的循环编辑等功能&#xff0c;为用户提供了更便捷…...

如何避免爬虫因Cookie过期导致登录失效

1. Cookie的作用及其过期机制 1.1 什么是Cookie&#xff1f; Cookie是服务器发送到用户浏览器并保存在本地的一小段数据&#xff0c;用于维持用户会话状态。爬虫在模拟登录后&#xff0c;通常需要携带Cookie访问后续页面。 1.2 Cookie为什么会过期&#xff1f; 会话Cookie&…...

集成方案 | Docusign + 甄零科技,赋能企业海外业务高效增长!

本文将详细介绍 Docusign 与甄零科技的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 甄零科技是一家专注于数字化合同管理系统的 SaaS 解决方案提供商&#xff0c;致力于为企业打造“…...

【Arxiv 2025】Single Image Iterative Subject-driven Generation and Editing

文章目录 文章标题作者及研究团队介绍01 在论文所属的研究领域&#xff0c;有哪些待解决的问题或者现有的研究工作仍有哪些不足&#xff1f;02 这篇论文主要解决了什么问题&#xff1f;03 这篇论文解决问题采用的关键解决方案是什么&#xff1f;04 这篇论文的主要贡献是什么&am…...

CoOAG:首个捕捉学术研究兴趣动态演变的数据集

2025-04-24&#xff0c;由西安交通大学基于学术合作网络构建一种新的动态图数据集CoOAG&#xff0c;用于研究动态图中的节点分类问题。该数据集通过捕捉作者研究兴趣的动态变化&#xff0c;为动态图学习领域提供了新的研究方向和测试平台&#xff0c;特别是在标签受限的动态节点…...

决策树随机深林

决策树和随机森林是机器学习中常用的两种模型&#xff0c;以下是对它们的简单介绍&#xff1a; 决策树 - 原理&#xff1a;通过一系列的条件判断对样本进行分类或预测。它由节点&#xff08;内部节点是属性上的测试&#xff0c;叶节点是类别或值&#xff09;和边组成&#xff0…...

Unity 和 Unreal Engine(UE) 两大主流游戏引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 两大主流游戏引擎的核心使用方法和对比分析&#xff0c;帮助开发者快速上手并根据项目需求选择合适工具&#xff1a; 一、Unity 使用指南 1. 安装与配置 安装&#xff1a;从 Unity Hub 下载&#xff0c;选择长期支持…...

Maven 依赖范围(Scope)详解

Maven 依赖范围&#xff08;Scope&#xff09;详解 Maven 是一个强大的项目管理工具&#xff0c;广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时&#xff0c;我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <depe…...

博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来

在卢浮宫幽深的长廊里&#xff0c;达芬奇的《蒙娜丽莎》正经历着一场看不见的战争——不是来自时间的侵蚀&#xff0c;而是空气中无形的水分子。每一件文物都在与湿度进行着无声的抗争&#xff0c;这场抗争关乎人类文明的延续。湿度&#xff0c;这个看不见的文物杀手&#xff0…...

消防应急物资智能调用立库:豪越科技助力消防“速战速决”

在消防救援的战场上&#xff0c;时间就是生命&#xff0c;每一秒都关乎着人民群众的生命财产安全。然而&#xff0c;在过去的紧急救援中&#xff0c;应急物资无法及时到位的情况时有发生&#xff0c;成为制约救援效率的关键难题&#xff0c;给救援工作带来了巨大的困境。 想象一…...

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…...

深度学习4.1 多层感知机

基本概念 多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种‌前馈人工神经网络‌&#xff0c;由输入层、至少一个隐藏层和输出层组成。 ‌核心特点‌&#xff1a; 采用‌全连接结构‌&#xff08;相邻层神经元全部相连&#xff1b; 通过‌非线性激活函数‌…...

解决两个技术问题后小有感触-QZ Tray使用经验小总结

老朋友都知道&#xff0c;我现在是一家软件公司销售部门的项目经理和全栈开发工程师&#xff0c;就是这么“奇怪”的岗位&#xff0c;大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。 近期在某个票务系统项目上驻场&#xff0c;原来我是这个项目的项目…...

非计算机专业如何利用AI开展跨学科和交叉研究

对于非计算机专业的研究者&#xff0c;利用AI开展跨学科研究既充满机遇也面临挑战。以下是一份系统化的指南&#xff0c;帮助您高效入门并找到交叉研究的突破口&#xff1a; 一、认知重塑&#xff1a;理解AI的本质与局限 AI不是“黑箱”&#xff1a;现代AI以数据驱动为核心&a…...

Python 数据可视化进阶:精准插入图表到指定 Excel 工作表

Python 数据可视化进阶&#xff1a;精准插入图表到指定 Excel 工作表 在处理数据的过程中&#xff0c;我们常常需要将生成的图表精准地插入到已存在数据的 Excel 文件的指定工作表中。借助 Python 的强大库组合&#xff0c;这一操作得以高效实现。以下是经过优化和注释补充的代…...

MQTT - MQTT 实践(Windows EMQX、MQTTX、客户端认证、连接与主题)

概述 -说明概括MQTT消息队列遥测传输协议一种规则EMQX一款大规模分布式物联网接入平台一个平台MQTTXMQTT 客户端一个工具 工具&#xff08;MQTTX&#xff09;和平台&#xff08;EMQX&#xff09;间遵循规则&#xff08;MQTT&#xff09;即可进行双向通信 一、Windows EMQX 下…...

【计算机网络物理层】从信号传输到介质选型的核心技术解析

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;信号模拟&#xff09;运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、…...

云原生--核心组件-容器篇-5-Docker核心之-容器

1、Docker容器的定义与核心概念 定义&#xff1a; Docker容器是基于Docker镜像运行的轻量级、独立、可移植的运行环境&#xff0c;它封装了应用程序及其依赖项&#xff0c;提供了一个隔离的执行空间。容器化应用比传统的虚拟机更加高效&#xff0c;因为它们共享主机操作系统的内…...

一、I/O的相关概念

I/O的相关概念 1、I/O I/O即Input和Output&#xff0c;用户进程执行I/O操作&#xff0c;归结起来&#xff0c;也就是向操作系统发出请求&#xff0c;读请求就把数据填到缓冲区里&#xff0c;写数据就把缓冲区里数据排干&#xff0c;目的地可以是磁盘也可以是其他通道。进程通…...

django filter 日期大于当前日期的

在Django中&#xff0c;如果你想要过滤出日期大于当前日期的记录&#xff0c;你可以使用Django的QuerySet API中的__gt&#xff08;大于&#xff09;操作符。这里是如何做到这一点的步骤&#xff1a; 确定你的模型&#xff1a;首先&#xff0c;确保你有一个模型&#xff08;Mo…...

Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例

下面分别为你介绍使用 Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例。 智慧水库周边环境模拟 1. 场景搭建 地形与地理特征&#xff1a;利用 Unreal Engine 的地形编辑工具&#xff0c;依据水库实际的地理测绘数据构建地形。模拟山脉、丘陵、河流等周边地貌&am…...

[MCU]SRAM

MCU存储体系 1.SRAM 2.FLASH 3.TCM SRAM SRAM&#xff08;Static Random-Access Memory&#xff09;:静态随机存取存储器. 特点&#xff1a;访问速度快、断电丢失、不 SRAM分类 1.系统SRAM&#xff1a;连接在系统总线上&#xff0c;所有外设和CPU都可访问 2.TCM SRAM&…...

【dockerredis】用docker容器运行单机redis

一、实验环境 操作系统&#xff1a;CentOS7.5 Minimal docker版本&#xff1a;18.06-ce redis版本&#xff1a;6.0.6 二、安装docker 关闭selinux # setenforce 0 # sed -i s/^SELINUX.*/SELINUXpermissive/g /etc/selinux/config 下载docker二进制安装包 # yum -y install…...

游戏引擎学习第247天:简化DEBUG_VALUE

欢迎。关于纹理传输的详细情况。 上周我们刚刚完成了纹理下载的相关工作&#xff0c;但实际上并没有完全解决这个问题。问题的核心是&#xff0c;当前关于纹理下载的正确方式仍然存在较大的不确定性。尽管我们在进行纹理下载的工作时已有一定进展&#xff0c;但依旧有不少模糊…...

Super Sample Tasker 学习-1

一、Super-Simple Tasker (SST) 是一个基于事件的、抢占式的、优先级基础的实时操作系统&#xff08;RTOS&#xff09;内核&#xff0c;完全符合 Rate Monotonic Analysis/Scheduling (RMA/RMS) 的要求。 此STT RTOS主要分成两大类&#xff0c;分别是抢占式SST和非抢占式STT0&…...

【C++】类和对象【中上】

目录 一、类与对象1、构造函数2、析构函数3、拷贝构造函数 个人主页<—请点击 C专栏<—请点击 一、类与对象 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默…...

概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?

用户问的是概率论与统计&#xff08;不确定性分析&#xff09;的主要应用方面&#xff0c;涉及的具体知识以及具体公式。首先&#xff0c;我需要确定概率论与统计在哪些领域有应用&#xff0c;比如工程、金融、医学、数据科学等等。然后&#xff0c;具体知识部分应该包括概率论…...

java面向对象编程【高级篇】之多态

目录 &#x1f680;前言&#x1f914;什么是多态&#xff1f;&#x1f31f;多态的优缺点&#x1f4af;优点&#x1f4af;缺点 &#x1f31f;类型转换&#x1f4af;自动类型转换&#x1f4af;强制类型转换 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介绍java…...

低压电工常见知识点

一.工厂用电 1.工厂一般有电源380V和220V。 三相:黄绿红 蓝 双色 助记符:王力宏 分别对应第一相(R),第二相(S)&#xff0c;第三相(T)&#xff0c;零线(N),地线(PE) 单相:红 黑 对应火线(L) 零线(N) 左零右火 二.人体安全电压是36V 三.变压器的讲解 变压器的符号…...

【Android】硬件合成器 HWC

硬件合成器(HWC) 深度解析 一、HWC 基本概念 硬件合成器(Hardware Composer, HWC)是Android显示系统的核心组件&#xff0c;负责高效管理图形层的合成与显示。作为SurfaceFlinger的关键模块&#xff0c;HWC通过硬件加速实现图层合成&#xff0c;显著提升性能并降低功耗。 二…...

【Android】dialogX对话框框架

文章目录 DialogX一、引入二、基础对话框 MessageDialog 和 输入对话框 InputDialog2.1.0 显示一个简单对话框2.1.1 构造对话框2.1.2 按钮点击回调2.2 输入对话框按钮点击回调2.3自定义布局2.4自定义进入和关闭动画 三、等待框WaitDialog和提示框TipDialog3.1 等待框3.2 提示框…...

解决 Elasticsearch 启动错误:failed to obtain node locks

1.遇到的问题&#xff1a; 在使用 Elasticsearch 时&#xff0c;可能会遇到以下错误&#xff1a; java.lang.IllegalStateException: failed to obtain node locks, tried [[path_to_data]] with lock id [0]; maybe these locations are not writable or multiple nodes were…...

DeepSeek:重构人类文明的智能引擎

一、技术革命&#xff1a;从通用智能到认知跃迁 1.1 架构创新&#xff1a;混合专家系统的突破 DeepSeek的混合专家&#xff08;MoE&#xff09;架构实现了对传统Transformer的颠覆性革新。其256个专家模块通过动态路由算法&#xff0c;在处理文本、图像、代码等多模态数据时&…...

(云计算HCIP)HCIP全笔记(九)本篇介绍操作系统基础,内容包含:操作系统组成、分类和定义,Linux的特性结构和Linux版本分类

1. 操作系统基础 1.1 操作系统的定义 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;&#xff0c;是管理和控制计算机硬件与软件资源的计算机程序&#xff08;系统软件&#xff09;。 1.2 操作系统的组成 通常站在用户角度&#xff0c;操作系统由内核和…...

Nginx的默认主配置文件 “/etc/nginx/nginx.conf“ 解读

安装Nginx后的默认主配置文件 “/etc/nginx/nginx.conf” 解读 详见如下配置及注释&#xff1a; # 指定 Nginx 工作进程运行的用户和用户组。这里指定以www - data用户来运行 Nginx 工作进程。 # 在基于 Debian 和 Ubuntu 的系统中&#xff0c;www-data 用户是默认存在的&…...

【AI模型学习】GPT——从v1到v3

文章目录 GPT-1GPT vs BERTGPT-2GPT-3Ai代码 GPT-1 GPT-1&#xff08;Generative Pretrained Transformer 1&#xff09;是 OpenAI 在2018年发布的第一个大规模预训练生成模型。它开创了基于 Transformer 的 预训练-微调 (pretraining-finetuning) 框架&#xff0c;在自然语言…...

用Function Calling让GPT查询数据库(含示例)

在本文中&#xff0c;我们通过一个简单的示例&#xff0c;介绍了 GPT模型结合Function Calling技术查询数据库 的基本流程。 Function Calling 是OpenAI推出的一项功能&#xff0c;允许大模型根据用户提问&#xff0c;自动生成函数调用指令&#xff0c;并由程序端实际执行外部操…...

DHCP 服务器运行流程图

以常见的 DHCP v4 为例,其完整流程如下: 一、客户端请求 IP 地址阶段 DHCPDiscover:客户端启动后,会以广播的形式发送 DHCPDiscover 报文,目的是在网络中寻找可用的 DHCP 服务器。该报文中包含客户端的 MAC 地址等信息,以便服务器能够识别客户端。DHCPOffer:网络中的 D…...

3. 使用idea将一个git分支的部分提交记录合并到另一个git分支

目录 1. 需求&#xff1a; 2. 操作步骤&#xff1a; &#xff08;1&#xff09;步骤一&#xff1a;idea切换项目分支到test上 &#xff08;2&#xff09;步骤二&#xff1a;在log窗口筛选出dev分支的提交记录 &#xff08;3&#xff09;步骤三&#xff1a;选中需要合并的记…...

GAEA情感坐标的技术架构与系统集成

为构建 AI 情感数据层&#xff0c;GAEA 整合了DePIN 网络、GODHOOD ID和情感坐标系三大核心组件&#xff0c;有效安全地整合用户数据&#xff0c;确保数据处理透明、高效、去中心化。架构如下&#xff1a; DePIN 网络&#xff1a;该去中心化基础设施为安全的数据传输和存储提供…...

04.通过OpenAPI-Swagger规范让Dify玩转Agent

dify安装 cd dify cd docker cp .env.example .env docker compose up -d准备自定义工具 我自建的PowerDNS&#xff0c;它的swagger如下&#xff1a; https://github.com/PowerDNS/pdns/blob/master/docs/http-api/swagger/authoritative-api-swagger.yaml 但需要加上&#x…...

idea软件配置移动到D盘

默认idea的配置在c盘&#xff0c;我现在软件配置已经15G了_(ཀ」 ∠)__ 。 需要关闭idea 移动软件 若是免安装版的直接移动本地软件目录就行了&#xff0c; 安装版的可以使用c盘搬家软件迁移。 移动配置本地文件 原位置&#xff1a; C:\Users\用户\AppData\Local\JetBrains…...

本安型交换机 + TSN:煤矿智能化的关键拼图

第二十三届太原煤炭&#xff08;能源&#xff09;工业技术与装备展览会于4月24日在潇河国际会展中心圆满落幕。作为矿山通信领域的创新企业&#xff0c;光路科技&#xff08;Fiberroad&#xff09;携多款核心产品集中亮相&#xff0c;涵盖万兆TSN矿用交换机、全千兆多光电融合交…...

基于SpringBoot+PostgreSQL+ROS Java库机器人数据可视化管理系统

以下是系统设计的详细方案&#xff1a; 1. 系统架构 ----------------- ------------------------ --------------------- -------------------- | 用户浏览器 | ---->| 前端应用 (SPA) | ---> | Spring Boot 后端 | ---> | ROS…...

机器学习算法-支持向量机SVM

支持向量机-python实现 由于本菜鸟目前还没有学习到软间隔和核函数的处理&#xff0c;so&#xff0c;先分享的硬间隔不带核函数&#xff0c;也就是不涉及非线性可分转化成线性可分的逻辑&#xff0c;后续如果学的懂&#xff0c;就在本篇文章的代码中继续拓展核函数等。 先来看…...

【仿Mudou库one thread per loop式并发服务器实现】服务器边缘测试+性能测试

服务器边缘测试性能测试 1. 长连接连续请求测试2. 超时连接释放测试13. 超时连接释放测试24. 超时连接释放测试35. 数据中多条请求处理测试6. PUT大文件上传测试7. 服务器性能测试 #include "httpserver.hpp" #define WWWROOT "./wwwroot"std::string Requ…...

【Spring Boot】Maven中引入 springboot 相关依赖的方式

Maven中引入 springboot 相关依赖的方式 1. 不使用版本管理&#xff08;不推荐&#xff09; 如果项目中没有统一版本管理&#xff0c;那么每个依赖都必须显式声明 <version>。 示例&#xff1a; <dependency><groupId>org.springframework.boot</group…...