【设计模式】单例模式 在java中的应用
文章目录
- 引言
- 什么是单例模式
- 单例模式的应用场景
- 单例模式的优缺点
- 优点
- 缺点
- 单例模式的基本实现
- 饿汉式单例模式
- 懒汉式单例模式
- 双重检查锁定
- 静态内部类
- 枚举单例
- 单例模式的线程安全问题
- 多线程环境下的单例模式
- 线程安全的实现方式
- 1. **懒汉式单例模式(线程不安全)**
- 2. **懒汉式单例模式(线程安全,使用同步方法)**
- 3. **双重检查锁定**
- 4. **静态内部类**
- 5. **枚举单例**
- 单例模式的序列化与反序列化
- 序列化导致的问题
- 如何防止反序列化破坏单例
- 单例模式的反射攻击
- 反射攻击导致的问题
- 如何防止反射破坏单例
- 使用枚举类型防止反射和序列化攻击
- 单例模式的实际应用案例
- 数据库连接池管理
- 日志管理
- 配置文件管理
- 总结
- 单例模式的最佳实践
- 单例模式的使用建议
引言
什么是单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通过控制实例化过程来避免创建多个实例,从而节省资源并确保全局状态的一致性。
在 Java 中,实现单例模式的核心思想是私有化构造方法,并通过一个公共的静态方法来返回类的唯一实例。
单例模式的应用场景
单例模式适用于以下场景:
- 资源管理器:如线程池、数据库连接池等,这些资源通常是重量级的,频繁创建和销毁会带来性能开销,因此需要一个全局唯一的实例来管理这些资源。
- 配置管理:应用程序的配置文件通常是全局唯一的,使用单例模式可以确保配置的唯一性和一致性。
- 日志记录器:日志记录器在整个应用程序中通常是唯一的,使用单例模式可以确保日志记录的统一性和线程安全性。
- 缓存:缓存数据通常需要全局唯一的实例来管理,以便在不同的地方访问和修改缓存时保持一致性。
单例模式的优缺点
优点
- 控制实例数量:确保一个类只有一个实例,避免了实例的重复创建,节省系统资源。
- 全局访问点:提供一个全局访问点,使得访问该实例变得简单。
- 延迟加载:某些实现方式(如懒汉式单例)可以实现延迟加载,即在需要时才创建实例,从而提高系统性能。
缺点
- 不易扩展:由于单例类的构造方法是私有的,继承和扩展变得困难。
- 隐藏依赖关系:单例模式隐藏了类之间的依赖关系,增加了代码的复杂性和维护难度。
- 多线程问题:在多线程环境下实现单例模式时,需要考虑线程安全问题,否则可能会创建多个实例。
单例模式的基本实现
饿汉式单例模式
饿汉式单例模式在类加载时就创建实例,确保类在第一次引用时就已经实例化。
public class HungrySingleton {// 类加载时就创建实例private static final HungrySingleton instance = new `();// 私有构造方法,防止外部实例化private HungrySingleton() {}// 提供公共的静态方法获取实例public static HungrySingleton getInstance() {return instance;}
}
优点:
- 实现简单。
- 线程安全,因为实例在类加载时就创建了。
缺点:
- 如果实例占用资源较多且未被使用,会造成资源浪费。
懒汉式单例模式
懒汉式单例模式在第一次需要使用实例时才创建,避免了资源浪费。
public class LazySingleton {// 静态变量保存单例实例private static LazySingleton instance;// 私有构造方法,防止外部实例化private LazySingleton() {}// 提供公共的静态方法获取实例public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
优点:
- 延迟加载,只有在需要时才创建实例。
缺点:
- 线程不安全,多线程环境下可能会创建多个实例。
双重检查锁定
双重检查锁定在懒汉式单例模式的基础上,使用同步块和双重检查机制来保证线程安全。
public class DoubleCheckedLockingSingleton {// volatile 确保 instance 的可见性和有序性private static volatile DoubleCheckedLockingSingleton instance;// 私有构造方法,防止外部实例化private DoubleCheckedLockingSingleton() {}// 提供公共的静态方法获取实例public static DoubleCheckedLockingSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance == null) {instance = new DoubleCheckedLockingSingleton();}}}return instance;}
}
优点:
- 线程安全。
- 延迟加载,性能较好。
缺点:
- 实现较为复杂,需要理解 volatile 关键字和双重检查机制。
静态内部类
静态内部类方式利用 JVM 类加载机制来保证线程安全,同时实现延迟加载。
public class StaticInnerClassSingleton {// 私有构造方法,防止外部实例化private StaticInnerClassSingleton() {}// 静态内部类private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}// 提供公共的静态方法获取实例public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}
优点:
- 线程安全。
- 延迟加载。
- 实现简单,利用 JVM 的类加载机制,避免了同步开销。
缺点:
- 无法提前创建实例。
枚举单例
枚举单例利用枚举类型本身的特性来保证单例模式的实现,是最简单且最安全的实现方式。
public enum EnumSingleton {INSTANCE;// 可以添加其他方法public void someMethod() {// 方法实现}
}
优点:
- 线程安全。
- 防止反序列化破坏单例。
- 防止反射攻击。
缺点:
- 无法实现延迟加载(但通常不需要,因为 JVM 保证枚举类的唯一性)。
单例模式的线程安全问题
多线程环境下的单例模式
在多线程环境中,单例模式的实现需要特别注意线程安全问题。多个线程同时访问单例类的实例获取方法时,可能会导致创建多个实例,违背单例模式的初衷。为了确保单例模式在多线程环境下的正确性,需要采取一些措施来保证线程安全。
线程安全的实现方式
1. 懒汉式单例模式(线程不安全)
最简单的懒汉式单例实现并没有考虑线程安全,在多线程环境下可能会创建多个实例。
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
2. 懒汉式单例模式(线程安全,使用同步方法)
通过在 getInstance
方法上加 synchronized
关键字,确保每次只有一个线程能够执行该方法,从而保证线程安全。
public class SynchronizedLazySingleton {private static SynchronizedLazySingleton instance;private SynchronizedLazySingleton() {}public static synchronized SynchronizedLazySingleton getInstance() {if (instance == null) {instance = new SynchronizedLazySingleton();}return instance;}
}
优点:
- 简单易实现。
- 线程安全。
缺点:
- 每次调用
getInstance
方法时都需要进行同步,性能开销较大。
3. 双重检查锁定
双重检查锁定在第一次检查实例是否为 null 时不加锁,只有在实例为 null 时才进行同步操作,从而减少了同步开销。
public class DoubleCheckedLockingSingleton {private static volatile DoubleCheckedLockingSingleton instance;private DoubleCheckedLockingSingleton() {}public static DoubleCheckedLockingSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance == null) {instance = new DoubleCheckedLockingSingleton();}}}return instance;}
}
优点:
- 线程安全。
- 相比同步方法,性能更高。
缺点:
- 实现复杂,需要注意
volatile
关键字的使用。
4. 静态内部类
利用 Java 的类加载机制,静态内部类在被调用时才会被加载,从而实现延迟加载和线程安全。
public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}
优点:
- 线程安全。
- 实现简单,延迟加载。
缺点:
- 无法防止反射攻击。
5. 枚举单例
枚举类型本身是线程安全的,并且枚举的实例是全局唯一的,可以防止反射和序列化导致的重新创建实例问题。
public enum EnumSingleton {INSTANCE;public void someMethod() {// some method}
}
优点:
- 线程安全。
- 防止反射和序列化导致的重新创建实例问题。
缺点:
- 枚举类型在某些情况下可能不适用(例如需要继承其他类)。
单例模式的序列化与反序列化
序列化导致的问题
在 Java 中,单例模式可能会由于序列化和反序列化而被破坏。具体来说,当一个单例对象被序列化到文件中,然后再从文件中反序列化回来时,会创建一个新的实例,这样就违反了单例模式的原则。
例如,考虑以下单例类:
import java.io.Serializable;public class Singleton implements Serializable {private static final long serialVersionUID = 1L;private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
如果我们进行序列化和反序列化操作:
import java.io.*;public class SingletonSerializationTest {public static void main(String[] args) throws Exception {Singleton instanceOne = Singleton.getInstance();// 序列化对象到文件ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("singleton.ser"));out.writeObject(instanceOne);out.close();// 从文件中反序列化对象ObjectInputStream in = new ObjectInputStream(new FileInputStream("singleton.ser"));Singleton instanceTwo = (Singleton) in.readObject();in.close();System.out.println("instanceOne hashCode: " + instanceOne.hashCode());System.out.println("instanceTwo hashCode: " + instanceTwo.hashCode());}
}
输出可能会是两个不同的哈希码,表明反序列化创建了一个新的实例。
如何防止反序列化破坏单例
为了防止反序列化破坏单例,可以在单例类中实现 readResolve
方法。这个方法在反序列化时会被自动调用,返回当前的单例实例,从而确保反序列化不会创建新的实例。
import java.io.Serializable;public class Singleton implements Serializable {private static final long serialVersionUID = 1L;private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}// 添加 readResolve 方法protected Object readResolve() {return getInstance();}
}
现在,如果我们再次运行序列化和反序列化操作,输出将会是相同的哈希码,表明反序列化没有创建新的实例:
import java.io.*;public class SingletonSerializationTest {public static void main(String[] args) throws Exception {Singleton instanceOne = Singleton.getInstance();// 序列化对象到文件ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("singleton.ser"));out.writeObject(instanceOne);out.close();// 从文件中反序列化对象ObjectInputStream in = new ObjectInputStream(new FileInputStream("singleton.ser"));Singleton instanceTwo = (Singleton) in.readObject();in.close();System.out.println("instanceOne hashCode: " + instanceOne.hashCode());System.out.println("instanceTwo hashCode: " + instanceTwo.hashCode());}
}
通过实现 readResolve
方法,可以确保序列化和反序列化过程中不会破坏单例模式,从而维护单例的唯一性。
单例模式的反射攻击
反射攻击导致的问题
Java 的反射机制允许在运行时动态地创建对象、调用方法和访问字段。通过反射,可以绕过私有构造函数,直接创建单例类的新实例,从而破坏单例模式。
例如,考虑以下单例类:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
使用反射可以创建新的实例:
Singleton instance1 = Singleton.getInstance();Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton instance2 = constructor.newInstance();System.out.println(instance1 == instance2); // 输出 false
如何防止反射破坏单例
为了防止反射攻击,可以在单例类的构造函数中加入防御措施,确保在构造函数被多次调用时抛出异常。
public class Singleton {private static final Singleton instance = new Singleton();private static boolean instanceCreated = false;private Singleton() {if (instanceCreated) {throw new RuntimeException("单例实例已经存在,不能创建多个实例");}instanceCreated = true;}public static Singleton getInstance() {return instance;}
}
在上述代码中,instanceCreated
标志用于检测是否已经创建过实例。如果构造函数被再次调用,则抛出异常,防止通过反射创建新的实例。
使用枚举类型防止反射和序列化攻击
使用枚举类型实现单例模式是防止反射和序列化攻击的最简单和最有效的方法。枚举类型在 Java 中是天然的单例,并且防止反射攻击和序列化攻击。
public enum EnumSingleton {INSTANCE;public void someMethod() {// some method}
}
枚举类型的单例不仅简单,而且可以防止反射和序列化导致的单例破坏问题。
单例模式的实际应用案例
数据库连接池管理
数据库连接池是一个典型的单例模式应用场景。通过单例模式,确保整个应用程序只存在一个数据库连接池实例,从而有效管理数据库连接资源。
public class DatabaseConnectionPool {private static DatabaseConnectionPool instance;private ConnectionPool pool;private DatabaseConnectionPool() {// 初始化连接池}public static synchronized DatabaseConnectionPool getInstance() {if (instance == null) {instance = new DatabaseConnectionPool();}return instance;}public Connection getConnection() {return pool.getConnection();}
}
日志管理
日志管理也是单例模式的一个常见应用。通过单例模式,确保整个应用程序使用同一个日志记录器实例,从而统一管理日志输出。
public class Logger {private static Logger instance;private Logger() {// 初始化日志配置}public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {// 记录日志}
}
配置文件管理
配置文件管理通常也使用单例模式,确保整个应用程序只加载一次配置文件,并提供统一的接口访问配置数据。
public class ConfigurationManager {private static ConfigurationManager instance;private Properties properties;private ConfigurationManager() {// 加载配置文件properties = new Properties();try (InputStream input = new FileInputStream("config.properties")) {properties.load(input);} catch (IOException ex) {ex.printStackTrace();}}public static synchronized ConfigurationManager getInstance() {if (instance == null) {instance = new ConfigurationManager();}return instance;}public String getProperty(String key) {return properties.getProperty(key);}
}
总结
单例模式的最佳实践
- 私有构造函数:确保构造函数是私有的,防止外部直接实例化。
- 静态方法获取实例:通过静态方法获取唯一的实例。
- 防止反射攻击:在构造函数中添加检查,防止反射攻击。
- 防止序列化破坏:实现
readResolve
方法,防止反序列化创建新的实例。 - 线程安全:在多线程环境中,使用合适的方式(如双重检查锁定、静态内部类、枚举单例)确保线程安全。
单例模式的使用建议
- 资源管理:适用于需要全局管理的资源,如数据库连接池、日志记录器、配置文件等。
- 性能考虑:在性能敏感的应用中,确保单例的创建和访问是高效的。
- 避免过度使用:虽然单例模式有其优势,但过度使用可能导致代码难以测试和维护。在设计时应慎重考虑是否真的需要单例模式。
- 测试友好:在单元测试中,可以使用依赖注入或其他设计模式来替代单例,以便于测试。
通过遵循这些最佳实践和使用建议,可以在项目中有效地应用单例模式,确保其稳定性和可维护性。
相关文章:
【设计模式】单例模式 在java中的应用
文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式(线程不安全&#…...
北京2024年CSP-S/J 及NOIP游记
北京2024年CSP-S/J 及NOIP游记 2024.9 开学2024.9 CSP-S12024.9 停课2024.10假期 误入歧途2024.10 CSP-S2 冲刺 2024.9 开学 开学升入初三,9月的前半个月一直在搞文化课(把文化课搞得风生水起),经历了1天的校运动会(摆…...
vue 纯前端对接阿里云oss文件上传封装,支持批量多文件上传,大文件上传时拿到上传进度。
使用阿里云上传先看官方文档(阿里云官方文档) 我这边只做了简单上传和分片上传,也包含了粘贴上传和拖拽上传。 1.首页先安装 npm i ali-oss2.在utils下创建uploadOss.js const OSS require(ali-oss) import { getOsstoken } from /api/in…...
YOLO系列发展历程:从YOLOv1到YOLO11,目标检测技术的革新与突破
文章目录 前言一、YOLOv1:单阶段目标检测的开端二、YOLOv2:更精准的实时检测三、YOLOv3:阶梯特征融合四、YOLOv4:性能和速度的新平衡五、YOLOv5:易用性和扩展性的加强六、YOLOv6:工业部署的利器七、YOLOv7&…...
认识Java中的异常(半成品)
1.异常的概念与体系结构 1.1在Java中,将程序执行过程中发生的不正常行为称为异常.比如 1.算数异常 public class Main1 {public static void main(String[] args){System.out.println(10/0);} } //异常信息为:Exception in thread "main" java.lang.ArithmeticExc…...
Sqoop 指令语法手册
目录 help指令list-databases参数描述示例 codegen参数描述 Sqoop create-hive-table参数描述 eval参数描述 Export参数描述 import参数描述 import-all-tables参数描述 import-mainframe参数描述 job参数描述 list-tables参数描述 merge参数描述 help指令 sqoop help 下面的S…...
网络安全 - SQL Injection
1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络…...
spi 发送与接收 移位写法
spi _tx 发送模块 片选信号cs可以在top顶层控制模块产生 timescale 1ns / 1psmodule spi_rom#(parameter SIZE 8 )(input wire clk ,input wire rst_n,input wire [SIZE-1:0] data ,input wire …...
MyBatis关联映射
目录 一、什么是关联注解? 二、数据库建表 1.学生表 2.教师表 三、一般查询 (1)创建StudentTeacher类 (2)mapper层 (3)Dao接口 (4)Test类 (5&#x…...
通过华为鲲鹏认证的软件产品如何助力信创产业
软件通过华为鲲鹏认证与信创产业有着密切的联系。鲲鹏认证是华为推动信创产业发展的一项重要举措,通过该认证,软件可以在华为的生态系统中实现更好的兼容性和性能优化,从而推动信创产业的全面发展和国产化替代。 鲲鹏认证的定义和重要性 鲲…...
陈志刚解读:国家数据基础设施建设解读(附下载)
本期分享陈志刚解读:国家数据基础设施建设解读,从背景意图、概念内涵、发展愿景与总体功能、总体架构、重点方向、算力底座、网络支撑、安全防护和组织保障十个方面展开,共52页ppt。 加入星球可获取完整版资料 篇幅限制,部分内容…...
QT 中 sqlite 数据库使用
一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …...
VPN设备
定义: 虚拟专用网络指的是在公用网络上建立专用网络的技术。之所以称为虚拟网主要是因为整个VPN网络的任意两个节点之间的连接并没 有传统专网所需的端到端的物理链路,而是架构在公用网络服务商所提供的网络平台之上的逻辑网络,用户数据在逻辑链路中传输…...
centos部署SkyWalking并在springcloud项目中用法举例
文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java AgentspringCloud 使用举例 场景 SkyWalking是应用性能监控平台,可用于分布式系统…...
[创业之路-186]:《华为战略管理法-DSTE实战体系》-1-为什么UTStarcom死了,华为却活了,而且越活越好?
目录 前言 一、市场定位与战略选择 二、技术创新能力 三、企业文化与团队建设 四、应对危机的能力 五、客户为中心的理念 六、市场适应性与战略灵活性 七、技术创新与研发投入 八、企业文化与团队建设 九、应对危机的能力 前言 UT斯达康(UTStarcom&#…...
算法设计5_分支限界法
分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树,裁剪那些不能得到最优解的子树以提高搜索效率。 步骤: ① 定义解空间(对解编码); ② 确定解空间的树结构; ③ 按BFS等方式搜索: a.每个活…...
【设计模式系列】状态模式(二十三)
一、什么是状态模式 状态模式(State Pattern)是一种行为设计模式,其核心目的是管理一个对象在其内部状态改变时的行为变化,其核心理念是将对象的行为和状态分离。这种模式通过将每个状态相关的行为封装在独立的类中,使…...
github创建发布分支
创建一个名为 latest 的分支,并将其作为稳定版本分支。以下是操作步骤: 1. 创建 latest 分支 首先,确保你在 master 分支(或当前的稳定版本分支)上,并且已经提交了所有更改。然后,你可以创建一…...
【Linux】网络服务
声明,以下内容均学习自《Linux就该这么学》一书 1、创建网络会话 Linux系统使用NetworkManager提供网络服务,它是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。 nmcli nmcli是一款基于命令行的网络配置工具,它…...
错题:Linux C语言
题目:手写代码:判断一个数(int类型的整数)中有有多少1 题目:手写代码:判断一个数(转换成二进制表示时)有几个1 #include <stdio.h> int main(int argc, const char *argv[]) { //判断一个数…...
机器学习期末速成
文章参考自B站机器学习期末速成课 本文仅作者个人复习使用 一、机器学习分类 聚类和分类的区别: 分类:一开始就知道有哪些类别 聚类:一开始不知道有哪些类别 损失函数:简单来说就是你预测出来的结果和真实值的差距。 0-1损失函数…...
【学习总结|DAY015】Java面向对象高级-抽象类、接口
引言 在今天的课程中,我们详细探讨了 Java 编程语言的几个核心特性:多态、final 关键字、抽象类和接口。这些概念是面向对象编程的基础,对于构建健壮、可维护的应用至关重要。本文将通过具体的例子和解释帮助大家更好地掌握这些知识点。 一…...
单词拼写纠正-04-161.力扣 相隔为 1 的编辑距离
拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法,如果提升 100W 倍的性能? NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊! 一个提升英文单词拼…...
深入理解 NumPy 广播机制:从基础到应用
目录 什么是广播机制?广播机制的规则广播机制示例1. 一维数组与标量运算2. 二维数组与一维数组运算3. 维度不同的数组运算4. 广播失败的情况 广播机制的实际应用场景1. 数据归一化2. 批量计算欧氏距离 总结广播机制的核心要点: 在使用 NumPy 进行数组操作…...
Springboot(五十三)SpringBoot3整合redisson
前边我们有记录Springboot2/3整合redis的方式。是基于Springboot默认集成的Lettuce客户端实现的。 今天我们在项目中集成的redission是在Lettuce之上构建的redis客户端。 Redisson:一个在Jedis和Lettuce之上构建的Redis客户端。提供了一系列分布式Java对象和服务,比如:分布式…...
UAC2.0 speaker——带反馈端点的 USB speaker(16bit 单声道)
UAC2.0 speaker 系列文章 UAC2.0 speaker——单声道 USB speaker(16bit) UAC2.0 speaker——类特殊请求 UAC2.0 speaker——音量控制 UAC2.0 speaker——多采样率支持 UAC2.0 speaker——24/32bit 支持 UAC2.0 speaker——speaker 数据传输 UAC2.0 speaker——同时支持 16bi…...
P2562 [AHOI2002] Kitty猫基因编码
P1498P2562 [AHOI2002] Kitty猫基因编码 #include <iostream> using namespace std; #include <cmath> #include <vector> #include <string> string encode(string str){if(str.find("0") string::npos) return "B";if(str.fin…...
HarmonyOS(65) ArkUI FrameNode详解
Node 1、Node简介2、FrameNode2.1、创建和删除节点2.2、对FrameNode的增删改2.3 FramNode的查询功能3、demo源码4、总结5、参考资料1、Node简介 在HarmonyOS(63) ArkUI 自定义占位组件NodeContainer介绍了自定义节点复用的原理(阅读本本篇博文之前,建议先读读这个),在Node…...
40分钟学 Go 语言高并发:负载均衡与服务治理
负载均衡与服务治理 一、知识要点总览 模块核心内容技术实现难度负载策略轮询、权重、最小连接数自定义负载均衡器中服务降级服务降级、熔断降级、限流降级Hystrix模式高熔断机制熔断器状态机、失败计数、自动恢复Circuit Breaker高限流设计令牌桶、滑动窗口、计数器Rate Lim…...
Python 从入门到实战45(Pandas数据操作)
我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们学习了pandas数据读写的相关基础知识。今天学习一下…...
node js 历史版本下载
此为node历史版本下载地址 https://nodejs.org/dist/https://nodejs.org/dist/...
无代码探索AI大模型:腾讯云函数计算的卓越实践
在数字化转型的浪潮中,人工智能(AI)技术已经成为企业提升竞争力的关键。然而,对于许多业务人员来说,技术门槛高、开发周期长等问题限制了他们快速探索和应用AI大模型的能力。同时,对于缺乏GPU资源的开发者来…...
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scra…...
vivado中,generate output product 和Create HDL wrapper的作用
generate output product 以zynq的ip核举例,没有generate output product之前,在ip source 什么也看不到。 但是同样的一个ip核,generate output product之后,会生成综合,布线和仿真文件,约束文件等等。 …...
欧盟R156法规注意事项及实例展示
欧盟 R156 法规即《关于批准车辆的软件升级和软件升级管理体系统一规定的法规》,其注意事项及实例如下: 注意事项: 软件升级管理体系方面: 体系建立与维持:汽车制造商和供应商必须建立完善的软件升级管理体系ÿ…...
HTML语义化的案例分析
HTML语义化的案例分析:对比实际网站中语义化与非语义化标签的差异 在现代Web开发中,HTML语义化被广泛认为是提升网页结构和可访问性的重要做法。HTML语义化不仅仅是为了让代码更清晰,更是为了增强搜索引擎优化(SEO)&a…...
使用 pyperclip 进行跨平台剪贴板操作
简介:pyperclip 是一个轻量级的 Python 库,支持在不同操作系统(Windows、macOS、Linux)中进行剪贴板的复制和粘贴。这个库的设计简单易用,非常适合需要频繁进行文本复制粘贴操作的场景。 历史攻略: 使用f…...
微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档
要解决此问题,需打开微信小程序开发者工具进行设置,打开详情-本地设置重新运行,该报错就没有啦...
Java:181 基于springboot的考编论坛管理系统
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统一共管理员,用户角色。 主要功能:收货地址管理、经验交流平台管理、公告信息管理、跳蚤市场管理、商品留言管理、商品订…...
通义千问sft-甄嬛对话
流程步骤 https://www.datawhale.cn/activity/110/21/76?rankingPage1 按照上面的流程,准备好数据之后就可以直接对7b的模型进行指令微调了,整个流程不是很复杂,操作起来比较方便。但是发布服务等了较长时间,以为出了bug 结果展…...
如何配置Jackson以忽略Java类中为null或空(empty)的字段
Jackson库提供了JsonInclude注解和ObjectMapper配置选项,可以用来控制是否在JSON输出中包含null或空值的字段。 默认情况下,Jackson会包含所有字段,不论其值为何。 本教程将展示如何使用Include.NON_NULL来忽略null值字段,以及使…...
设置笔记本同时连接内外网
原理:通过笔记本和手机相连,实现双网卡功能能。笔记本连接内网wifi、同时手机端开启usb网络共享,笔记本就有了两个网,然配置那个访问外网,那个访问内网。 1.笔记本wifi连接内网wifi 2.手机端共享网络。 手机打开 -【…...
让文章更具说服力:如何巧妙运用逻辑
在写作的过程中,不论是创作小说、撰写学术论文,还是撰写营销文案,逻辑的运用都至关重要。一个没有逻辑支撑的文章,很容易让读者产生困惑、迷失方向,甚至失去阅读兴趣。因此,如何巧妙地运用逻辑,…...
阿里云云服务器Docker-Execrise
申请云服务器 阿里云每个人可以免费申请三个月的使用的服务器可以用作学习使用建议申请规格2核4g的,2g的有点捉襟见肘了选择服务器建议alibaba-linux服务器,就是linux;选择windows可能由于2核4g的限制,docker不匹配系统起码我就是…...
解决 MySQL 启动失败与大小写问题,重置数据库
技术文档:解决 MySQL 启动失败与大小写问题,重置数据库 1. 问题背景 在使用 MySQL 时,可能遇到以下问题: MySQL 启动失败,日志显示 “permission denied” 或 “Can’t create directory” 错误。MySQL 在修改配置文…...
启智畅想集装箱箱号识别算法,2台相机即可实现较高识别率
启智畅想集装箱箱号识别算法,在货车通道中使用时,一般配备2台相机即可。启智畅想集装箱箱号识别算法,在货车通道中使用时,一般配备2台相机即可实现对集装箱箱号的精准捕捉与识别。这两台相机分别安装在货车通道的后侧和随意侧面&a…...
【C++】指针与智慧的邂逅:C++内存管理的诗意
文章目录 RAII 智能指针auto_ptrunique_ptr shared_ptr模拟实现定制删除器循环引用 和 weak_ptr RAII RAII(Resource Acquisition Is Initialization)是一种广泛应用于 C 等编程语言中的编程范式,它的核心思想是:资源的获取和释放…...
python中的高阶函数
1、什么是高阶函数? 高阶函数是指将函数作为参数传入。就是高阶函数 2、高阶函数有哪些? map 映射函数 >>> print(list(map(lambda x:x*x,range(1,11)))) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>> print(list(map(lambda x:st…...
spark关联hive 报 Filesystem Close 错误
请看如下问题: 假如我想将一个sql语句插入hive表中时,比如 insert into table tmp.app_user_active_range partition (dt2022-11-04) 报如下错误: 我的环境是pyspark,pyspark中操作hive,使用datagrip关联spark,在da…...
MySQL主从同步详解
文章目录 MySQL主从同步概述MySQL主从同步原理MySQL主从同步结构模式MySQL主从同步搭建搭建步骤一主一从实验环境master主机slave1主机验证主从同步 一主多从master主机slave2主机验证主从同步 MySQL主从同步复制模式 读写分离技术MaxScale简介部署MaxScale服务器授权用户maste…...