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

每日学习 设计模式 五种不同的单例模式

狮子大佬原文
https://blog.csdn.net/weixin_40461281/article/details/135050977

第一种 饿汉式

为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃饱了

   //饿汉单例public class Demo1{private static final Demo1 instance = new Demo1();public Demo1(){}public static Demo1 getInstance(){return instance;}}

优点:执行效率高,性能高,没有任何的锁
缺点:某些情况下,可能会造成内存浪费

第二种 懒汉式

懒汉指的是“懒”也就是说,实例对象的创建是延迟的,只有在第一次调用 getInstance() 方法时,才会创建单例对象。它不像饿汉模式那样在程序启动时就立即创建实例,而是在需要的时候才进行实例化。

优点:节省了内存,线程安全
缺点:性能低

三种创建方式

  • 第一种 不加锁
    //懒汉单例public lass Demo2{private static Demo2 instance;public Demo2(){}public static Demo2 getInstance(){if (instance == null){instance = new Demo2();}return instance;}}

无法保证单例

  • 第二种 增加 synchronized 锁
    //懒汉加锁public class Demo3{private static Demo3 instance;public Demo3(){}public synchronized static Demo3 getInstance(){if (instance == null){instance = new Demo3();}return instance;}}

可以保证单例 但性能较低 所有的线程全都被阻塞到方法外部排队处理

  • 第三种 双重校验单例
   //懒汉双重校验public class Demo4{private static Demo4 instance;public Demo4(){}public  static Demo4 getInstance(){if (instance == null){synchronized(Demo4.class){if (instance == null){instance = new Demo4();}}}return instance;}}

只锁创建方法提高性能,可以保证单例 性能还高 可以避免不必要的加锁
优点: 性能高了,线程安全了
缺点:可读性难度加大,不够优雅

第三种 枚举单例

在这种实现方式中,既可以避免多线程同步问题,还可以防止通过反射和反序列化来重新创建新的对象。
Java虚拟机会保证枚举对象的唯一性,因此每一个枚举类型和定义的枚举变量在JVM中都是唯一的。

public enum Demo5 {INSTANCE;private Object data;public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

INSTANCE 是 Demo5 枚举类的唯一实例。当程序运行时,Demo5.INSTANCE 就是该枚举类的唯一存在,也就是单例实例。

第四种 Spring中的单例模式实现 也可以称为 容器化单例

Spring 源码中的 DefaultSingletonBeanRegistry 类 getSingleton 方法

@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {// Quick check for existing instance without full singleton lock.Object singletonObject = this.singletonObjects.get(beanName); // 尝试从 singletonObjects 缓存中直接获取已存在的单例对象。这个步骤不加锁,是为了提高性能。if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {// 如果未找到单例对象,并且该单例对象正在创建中,进入下一个判断。singletonObject = this.earlySingletonObjects.get(beanName); // 尝试从 earlySingletonObjects 缓存中获取提前引用的对象。if (singletonObject == null && allowEarlyReference) {// 如果 still 没有找到对象,并且允许提前引用时,尝试获取对象。if (!this.singletonLock.tryLock()) {// 如果无法获取锁,则避免在创建过程中返回提前引用,防止线程不安全的情况。return null;}try {// 在获取锁后,确保完整的单例创建过程。singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {// 如果单例对象还是没找到,进一步检查 earlySingletonObjects。singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null) {// 如果 earlySingletonObjects 中也没有找到,则需要从 singletonFactories 获取对象。ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {// 从 singletonFactories 中获取单例对象工厂,并调用 getObject() 创建对象。singletonObject = singletonFactory.getObject();// 获取对象后,检查该对象是否已添加或移除。if (this.singletonFactories.remove(beanName) != null) {// 如果工厂从 singletonFactories 中移除,说明创建了对象,放入 earlySingletonObjects 中。this.earlySingletonObjects.put(beanName, singletonObject);}else {// 如果对象被移除,说明对象已存在于 singletonObjects 中。singletonObject = this.singletonObjects.get(beanName);}}}}}finally {this.singletonLock.unlock(); // 无论如何释放锁,保证线程安全。}}}return singletonObject; // 返回找到的单例对象,如果找不到,则返回 null。
}

这里涉及到三个单例容器:

  • singletonObjects:
    这是最终存放已创建单例对象的缓存。正常情况下,当一个单例对象创建完成后,它会被放入这个缓存中,供后续的使用和访问。
    只有当对象完全创建完成且没有依赖其他对象时,它才会进入这个缓存。
  • earlySingletonObjects:
    当一个单例对象正在被创建时,可能有其他的 bean 依赖于它。为了防止这种依赖造成死锁或递归调用,Spring 会在对象创建的过程中将当前已经部分初始化的对象放到这个缓存中,供其他 bean 在创建过程中访问。
    这就是所谓的 “提前曝光”,指的是在对象完全初始化之前,Spring 就让它能被其他依赖的 bean 使用。
  • singletonFactories:
    这个缓存中存放的是 ObjectFactory 对象,也就是单例对象的工厂。它们并不直接存储单例实例,而是存储生成单例实例的工厂。只有在没有找到单例对象(在前两个缓存中都找不到时),Spring 才会通过这些工厂来创建对象。
    这个缓存确保了在单例对象工厂可以提供实例之前,不会因为某个对象的引用而导致创建死锁。

单例的获取顺序是singletonObjects -> earlySingletonObjects -> singletonFactories 这样的三级缓存
singletonObjects 指单例对象的缓存,singletonFactories 指单例对象工厂的缓存,earlySingletonObjects 指提前曝光的单例对象的缓存。
以上三个构成了三级缓存,Spring 就用这三级缓存巧妙的解决了循环依赖问题。

这里引发一个思考: 为什么要使用三级缓存才能解决循环依赖呢?这里转载一篇博客

原文链接:https://blog.csdn.net/qq_33204709/article/details/130423123

在这里插入图片描述

如果只使用一级缓存,我们可以根据上面的例子看到,类A和类B都不存在,根本没有初始化完成的对象可以存放到一级缓存中,所以循环依赖没有修复(死循环)

如果想打破上面循环依赖的死循环,就需要一个另一个缓存来将已经实例化但是没有完成依赖注入的对象给缓存起来这就是二级缓存。
在这里插入图片描述
然后再配合一级缓存,我们将创建好的单例对象存放到单例池中,同时清空二级缓存中对应的原始对象(半成品实例)
在这里插入图片描述
看到这里,我们就会有疑问,这不是一级缓存 + 二级缓存已经解决了循环依赖的问题了吗?为什么还需要三级缓存?

假如类A被增强了,那么我们需要注入到Bean容器中的就是A的代理对象,那么经过上面一整套流程下来,存放到一级缓存中的并不会是代理对象A,而是对象A。

为了将对应的代理对象A的实例也注入到容器中,这里我们就需要使用三级缓存了。

首先,我们在实例化A之后,将A中用于创建代理对象A的工厂对象 A-ObjectFactory,和B中用于创建对象B的工厂对象 B-ObjectFactor 放到三级缓存中。

并使用A的工厂对象 A-ObjectFactory 作为A的实例注入到A中。
在这里插入图片描述
然后,我们通过A的ObjectFactory对象创建A的代理对象(半成品/原始对象),然后将A的代理对象注入给B,就可以将B创建成功。
在这里插入图片描述
最后,我们将创建好的B放入单例池中,然后将B注入给A,这样我们就可以最终将A创建成功,然后将创建好的A再放入单例池中。

在这里插入图片描述
这样我们就成功使用三级缓存来解决了创建对象时的循环依赖的问题。

三级缓存只是解决了构造函数之后的循环依赖问题,那么构造函数的循环依赖问题怎么解决呢?
在这里插入图片描述
Spring 给我们提供了一个 @Lazy 注解,也叫懒加载,或延迟加载。被这个注解修饰的对象,只有在使用的时候才会创建实例,那时单例池中的其他对象都已经创建好了,便解决了循环依赖的问题。

第五种 特殊单例 线程单例

顾名思义 保证在所有线程内的单例
常见使用场景 日志框架 确保每个线程内都有一个单例日志实例 保证日志记录和输出的唯一性
在线程内最常使用的 TheadLocal 可以保证线程之间的变量隔离 基于他来实现线程单例

public class ThreadLocalSingleton {// 通过 ThreadLocal 的初始化方法 withInitial 初始化对象实例 保证线程唯一private static final ThreadLocal<ThreadLocalSingleton> threadLocaLInstance =ThreadLocal.withInitial(() -> new ThreadLocalSingleton());private ThreadLocalSingleton(){}public static ThreadLocalSingleton getInstance(){return threadLocaLInstance.get();}
}

相关文章:

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

C++类和对象

目录 一、类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 二、实例化 2.1、实例化概念 2.2、对象大小 三、this指针 四、类的默认成员 4.1、构造函数 4.2、析构函数 4.3、拷贝构造 4.4、赋值运算符重载 4.4.1、运算符重载 4.4.2、赋值运算符重载 4.5、日…...

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统&#xff0c;能够理解、推理和生成信息。它的核心作用包括&#xff1a; 1.1 语义理解 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI知识库能够理解用户查询的语义&#xff0c;而不仅仅是关键词匹配。 …...

docker常用命令及案例

以下是 Docker 的所有常用命令及其案例说明&#xff0c;按功能分类整理&#xff1a; 1. 镜像管理 1.1 拉取镜像 命令: docker pull <镜像名>:<标签>案例: 拉取官方的 nginx 镜像docker pull nginx:latest1.2 列出本地镜像 命令: docker images案例: 查看本地所有…...

webpack【初体验】使用 webpack 打包一个程序

打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…...

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…...

初始数据结构☞复杂度与泛式

一.时间复杂度 定义&#xff1a; 算法的时间复杂度是一个数学函数&#xff0c;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度。 O渐进表示方法&#xff1a; 原因&#xff1a; 计算时间复杂度时&#xff0c;我们其实并不一定要计算精确的执行次数&#xff0c;而…...

理解UML中的四种关系:依赖、关联、泛化和实现

在软件工程中&#xff0c;统一建模语言&#xff08;UML&#xff09;是一种广泛使用的工具&#xff0c;用于可视化、设计、构造和文档化软件系统。UML提供了多种图表类型&#xff0c;如类图、用例图、序列图等&#xff0c;帮助开发者和设计师更好地理解系统的结构和行为。在UML中…...

go语言中的反射

为什么会引入反射 有时我们需要写一个函数&#xff0c;这个函数有能力统一处理各种值类型&#xff0c;而这些类型可能无法共享同一个接口&#xff0c;也可能布局未知&#xff0c;也有可能这个类型在我们设计函数时还不存在&#xff0c;这个时候我们就可以用到反射。 空接口可…...

【前端】打造自己的hexo博客_hexo一本通

今日更新完毕&#xff0c;建议关注收藏点赞&#xff01; 目录 打造自己的hexo blog挂载到自己的github主页设计自己的theme 打造自己的hexo blog #需要安装git node.js 这里略#安装hexo npm install -g hexo-cli npm install hexo hexo help#<folder>必须是空的 hexo in…...

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...

储能系统-系统架构

已更新系列文章包括104、61850、modbus 、单片机等&#xff0c;欢迎关注 IEC61850实现方案和测试-1-CSDN博客 快速了解104协议-CSDN博客 104调试工具2_104协议调试工具-CSDN博客 1 电池储能系统&#xff08;BESS&#xff09; 架构 电池储能系统主要包括、电池、pcs、本地控制…...

程序员也可以这样赚钱

最近有朋友和我交流了关于程序员副业的想法&#xff0c;我想借这个机会对目前软件开发常用的兼职平台做一个梳理。 以下是程序员接副业的靠谱平台推荐&#xff0c;结合政策合规性、平台口碑及实际操作性整理&#xff0c;覆盖国内外主流选择&#xff1a; 一、国内综合型平台 程序…...

STM32启动过程概述

1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始&#xff0c;到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…...

Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗

Elasticsearch 本身并不直接收集目标服务器的日志&#xff0c;它主要用于存储、搜索和分析数据。要收集目标服务器的日志&#xff0c;通常会借助其他工具&#xff0c;并且一般不需要在目标服务器上安装 Elasticsearch 软件&#xff0c;常见的日志收集方案&#xff1a; Filebeat…...

Linux:软硬链接和动静态库

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;软硬链接和动静态库》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff0…...

C# 比较两个List集合内容是否相同

在 C# 中&#xff0c;要比较两个 List<T> 集合的内容是否相同&#xff0c;可以通过以下几种方法&#xff1a; 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法&#xff08;顺序和内容都相等&#xff09; 顺序和内容都相等&#xff1a;使用 SequenceEqual。 usin…...

IDEA中Resolving Maven dependencies卡着不动解决方案

一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现‌。以下是具体步骤: ‌1、找到settings.xml文件‌: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、‌编辑se…...

重生之我要当云原生大师(十一)访问Linux文件系统

目录 一、解释下文件系统、块设备、挂载点、逻辑卷。 二、简述文件系统、块设备、挂载点、逻辑卷之间的关系&#xff1f; 三、如何检查文件系统&#xff1f; 四、挂载和卸载文件系统的流程&#xff1f; 五、find命令都可以根据什么查找文件。 一、解释下文件系统、块设备、…...

驱动开发系列34 - Linux Graphics Intel 动态显存技术的实现

一:概述 动态显存技术(Dynamic Video Memory Technology, DVMT)是一种由 Intel 提出的内存分配技术,主要用于整合显卡(集成显卡)系统中,以便动态地调整显存大小,从而在不同的负载场景下优化内存使用和系统性能。 动态显存技术的核心在于共享系统内存。集成显卡没有独立…...

feign 远程调用详解

在平常的开发工作中&#xff0c;我们经常需要跟其他系统交互&#xff0c;比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么&#xff0c;我们应该通过什么方式进行系统之间的交互呢&#xff1f;今天&#xff0c;简单来总结下 feign 的用法。 1&#xff1a;引入依…...

HTML5 应用程序缓存

HTML5 应用程序缓存 引言 随着互联网技术的飞速发展,移动设备的普及,用户对于网页的加载速度和离线访问的需求日益增长。HTML5 应用程序缓存(Application Cache,简称AppCache)应运而生,它允许开发者将网页资源存储在本地,从而实现网页的快速加载和离线访问。本文将详细…...

7.PPT:“中国梦”学习实践活动【20】

目录 NO1234​ NO5678​ NO9\10\11 NO1234 考生文件夹下创建一个名为“PPT.pptx”的新演示文稿Word素材文档的文字&#xff1a;复制/挪动→“PPT.pptx”的新演示文稿&#xff08;蓝色、黑色、红色&#xff09; 视图→幻灯片母版→重命名&#xff1a;“中国梦母版1”→背景样…...

利用NestJS构建高效的RESTful API接口

1. 引言 项目背景与目标 随着互联网应用的快速发展,RESTful API已成为前后端分离架构中的重要组成部分。本文将介绍如何使用NestJS构建一个高效且可维护的RESTful API接口。目标是通过NestJS的模块化和依赖注入特性,实现一个易于扩展和维护的API系统。 RESTful API的重要性…...

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…...

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…...

目前推荐的优秀编程学习网站与资源平台,涵盖不同学习方式和受众需求

一、综合教程与互动学习平台 菜鸟教程 特点:适合零基础新手,提供免费编程语言教程(Python、Java、C/C++、前端等),页面简洁且包含大量代码示例,支持快速上手。适用人群:编程入门者、需要快速查阅语法基础的学习者。W3Schools 特点:专注于Web开发技术(HTML、CSS、JavaS…...

kafka 3.5.0 raft协议安装

前言 最近做项目&#xff0c;需要使用kafka进行通信&#xff0c;且只能使用kafka&#xff0c;笔者没有测试集群&#xff0c;就自己搭建了kafka集群&#xff0c;实际上笔者在很早之前就搭建了&#xff0c;因为当时还是zookeeper&#xff08;简称ZK&#xff09;注册元数据&#…...

正则表达式的简单介绍 + regex_match使用

正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成&#xff0c;用于描述、匹配一系列符合某个句法规则的字符串。正则表达式广泛应用于文本搜索、替换、验证等场景。 它的主…...

kafka服务端之延时操作前传--时间轮

文章目录 背景时间轮层级时间轮时间轮降级kafka中的时间轮kafka如何进行时间轮运行 背景 Kafka中存在大量的延时操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka并没有使用JDK自带的Timer或DelayQueue来实现延时的功能&#xff0c;而是基于时间轮的概念自定义实现…...

鸿蒙harmony 手势密码

1.效果图 2.设置手势页面代码 /*** 手势密码设置页面*/ Entry Component struct SettingGesturePage {/*** PatternLock组件控制器*/private patternLockController: PatternLockController new PatternLockController()/*** 用来保存提示文本信息*/State message: string …...

如何修复WordPress连接超时显示curl-error-28的错误

许多WordPress用户都会遇到这样的问题&#xff1a;网站加载变慢或数据传输失败&#xff0c;后台提示‘cURL错误28&#xff1a;连接超时’。这其实是一个常见的问题&#xff0c;通常是由于数据传输时间过长造成的。虽然这个错误听起来复杂&#xff0c;但解决起来并不算困难。本文…...

CSS 相关知识

1、高度已知&#xff0c;三栏布局&#xff0c;左右宽度 200&#xff0c;中间自适应&#xff0c;如何实现&#xff1f; <body><div class"box"><div class"box1">高度已知</div><div class"box2">左右宽度 200&…...

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释&#xff1a; Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...

一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路

以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单

文章目录 系列文章现象原因分析时间点含义正常情况测试市场反应诱导跟风操纵股价意图系列文章 看盘细节系列 篇一:集合竞价尾盘突变 现象 集合竞价中 9 点 18 分通过一笔大单或连续几笔大单将股价打到 3% 以下或以上,9 点 19 分又迅速撤单。从而在分时图上留下一根长长的上…...

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...

【C语言标准库函数】双曲函数:sinh(), cosh(), tanh()

目录 一、头文件 二、函数简介 2.1. 双曲正弦函数 sinh(double x) 2.2. 双曲余弦函数 cosh(double x) 2.3. 双曲正切函数 tanh(double x) 三、函数实现&#xff08;概念性&#xff09; 四、注意事项 4.1. 参数类型 4.2. 计算精度 4.3. 函数返回值 4.4. 环境差异 4.…...

Visual Studio(VS)初始配置环境(scanf异常)

发现问题 当我们第一次安装Visual Studio&#xff08;VS&#xff09;且没有初次环境配置时&#xff0c;用某些函数时会发现报错异常。&#xff08;如下scanf函数为例&#xff09; #include<stdio.h>int main() {int a 0;scanf("%d", &a);printf("%…...

【JVM详解一】类加载过程与内存区域划分

一、简介 1.1 概述 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…...

《图解设计模式》笔记(五)一致性

十一、Composite模式&#xff1a;容器与内容的一致性 像文件夹与文件一样&#xff0c;文件夹中可以放子文件夹与文件&#xff0c;再比如容器中可以放更小的容器和具体内容。 Composite模式&#xff1a;使容器与内容具有一致性&#xff0c;创造出递归结构。 Composite&#x…...

burpsuite抓取html登陆和上传数据包

一、burpsuite抓取html登陆数据包 1、先写一个html格式的登陆页面 <!doctype html> <html lang="en"> <head><meta charset="UTF-8"><title>这是标签</title></head> <body> <hr><!-- 登陆表单…...

前端导出pdf,所见即所得

一、推荐方案&#xff1a;html2canvas jsPDF&#xff08;图片式PDF&#xff09; javascript import html2canvas from html2canvas; import jsPDF from jspdf;const exportPDF async (elementId, fileName) > {const element document.getElementById(elementId);// 1.…...

使用orjson库提升Python JSON处理性能

使用orjson库提升Python JSON处理性能 引言 在现代软件开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;广泛应用于Web服务、配置文件、数据存储等场景。Python作为一门流行的编程语言&#xff0c;提供了…...

TcpClientTest

ClientTest&#xff1a; using System; using System.Net.Sockets; using System.Text;class TcpClientTest {static void Main(string[] args){try{// 创建一个TcpClient实例并连接到服务器 TcpClient client new TcpClient("1vg5062570.51mypc.cn", 43319);//1v…...

【系统架构设计师】操作系统 ② ( 存储管理 | 页式存储 | 逻辑地址 与 物理地址 | 页表结构 | 物理内存淘汰机制 )

文章目录 一、页式存储1、CPU 调用数据2、内存存储数据弊端3、分页存储4、逻辑地址 和 物理地址 的结构5、逻辑地址 和 物理地址 的结构 示例6、页式存储 优缺点 二、逻辑地址 与 物理地址1、逻辑地址2、物理地址3、逻辑地址 与 物理地址 区别4、逻辑地址 与 物理地址 的转换 三…...

STM32自学记录(八)

STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表&#xff0c;把引脚的电压值测出来&#xff0c;放在一个变量里。 ADC&#xff1a;模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…...

Vim 多窗口编辑及文件对比

水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口&#xff0c;输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…...

基于深度学习的人工智能量化衰老模型构建与全流程应用研究

一、引言 1.1 研究背景与意义 1.1.1 人口老龄化现状与挑战 人口老龄化是当今全球面临的重要社会趋势之一,其发展态势迅猛且影响深远。根据联合国的相关数据,1980 年,全球 65 岁及以上人口数量仅为 2.6 亿,到 2021 年,这一数字已翻番,达到 7.61 亿,而预计到 2050 年,…...

第八届大数据与应用统计国际学术研讨会(ISBDAS 2025)

重要信息 官网&#xff1a;www.is-bdas.org 时间&#xff1a;2025年2月28-3月2日 地点&#xff1a;中国 广州 主办单位&#xff1a;广东省高等教育学会人工智能与高等教育研究分会 协办单位&#xff1a;北京师范大学人工智能与未来网络研究院、人工智能与大数据科研基地 …...