Android 单例模式全解析:从基础实现到最佳实践
单例模式(Singleton Pattern)是软件开发中常用的设计模式,其核心是确保一个类在全局范围内只有一个实例,并提供全局访问点。在 Android 开发中,单例模式常用于管理全局资源(如网络管理器、数据库助手、配置中心等),避免重复创建对象造成的资源浪费。本文将详细解析 Android 中单例模式的六种常用实现方式,对比其优缺点及适用场景,并结合 Android 特性给出最佳实践。
一、饿汉式单例(Eager Initialization)
实现原理
在 Java 里,类的加载过程是由 JVM 严格把控的。当类被加载时,静态变量会随之初始化。饿汉式单例正是利用了这一特性,借助静态变量来持有唯一的实例。由于静态变量的初始化操作是在类加载阶段完成的,而类加载是线程安全的,所以饿汉式单例天然具备线程安全的特性。
代码实现
public class EagerSingleton {// 1. 私有静态实例,类加载时创建private static final EagerSingleton INSTANCE = new EagerSingleton();// 2. 私有构造函数,禁止外部实例化private EagerSingleton() {// 初始化操作(如上下文、配置)}// 3. 公共访问接口public static EagerSingleton getInstance() {return INSTANCE;}
}
private static final EagerSingleton INSTANCE = new EagerSingleton();
:这行代码定义了一个私有静态常量INSTANCE
,在类加载时就会创建EagerSingleton
的实例。private EagerSingleton()
:私有构造函数防止外部代码通过new
关键字创建新的实例。public static EagerSingleton getInstance()
:提供一个公共的静态方法,用于获取单例实例。
特点
- 优点:简单直接,线程安全,无需额外同步开销。
- 缺点:类加载时立即创建实例,即使未被使用也会占用内存(“饿汉” 命名由来)。
- 适用场景:实例占用资源少,或需要在程序启动时初始化。
二、懒汉式单例(Lazy Initialization)
实现原理
懒汉式单例采用延迟初始化的策略,也就是在首次调用 getInstance()
方法时才会创建实例。不过,未进行同步处理的懒汉式单例在多线程环境下是不安全的,因为多个线程可能同时判断实例为 null
,进而创建多个实例。
非线程安全版本(危险!)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}// 未加同步,多线程下可能返回不同实例public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton(); // 非原子操作,可能引发竞态条件}return instance;}
}
private static LazySingleton instance;
:定义一个静态变量instance
,初始值为null
。if (instance == null)
:多个线程可能同时判断instance
为null
,从而进入if
语句块,创建多个实例。
线程安全版本(直接同步)
public class SynchronizedLazySingleton {private static SynchronizedLazySingleton instance;private SynchronizedLazySingleton() {}// 同步整个方法,效率较低public static synchronized SynchronizedLazySingleton getInstance() {if (instance == null) {instance = new SynchronizedLazySingleton();}return instance;}
}
public static synchronized SynchronizedLazySingleton getInstance()
:使用synchronized
关键字修饰方法,保证同一时刻只有一个线程可以进入该方法,从而避免创建多个实例。
特点
- 优点:延迟初始化,节省内存(“懒汉” 命名由来)。
- 缺点:直接同步方法(
synchronized
)导致每次调用都需等待锁,性能瓶颈明显。 - 适用场景:单线程环境或对性能要求极低的场景(实际开发中极少使用)。
三、双重检查锁定(Double-Checked Locking, DCL)
实现原理
双重检查锁定模式结合了延迟初始化和线程安全的特性。通过两次空值检查和同步块的使用,在减少锁竞争的同时保证了线程安全。volatile
关键字的使用是为了避免指令重排序,确保实例的初始化过程按顺序执行。
代码实现
public class DCLSingleton {// 1. volatile 禁止指令重排序,确保实例初始化完成private static volatile DCLSingleton instance;private DCLSingleton() {// 初始化操作(避免复杂逻辑,防止阻塞)}public static DCLSingleton getInstance() {// 第一次检查:无实例时进入同步块if (instance == null) {synchronized (DCLSingleton.class) { // 同步类对象,锁粒度更小// 第二次检查:避免多个线程同时通过第一次检查if (instance == null) {instance = new DCLSingleton(); // 非原子操作,需 volatile 保证可见性}}}return instance;}
}
关键细节
private static volatile DCLSingleton instance;
:使用volatile
关键字修饰instance
变量,确保其在多线程环境下的可见性和有序性。- 第一次
if (instance == null)
:在进入同步块之前进行检查,如果实例已经存在,则直接返回,避免不必要的锁竞争。 synchronized (DCLSingleton.class)
:对类对象进行同步,确保同一时刻只有一个线程可以进入同步块。- 第二次
if (instance == null)
:在同步块内部再次检查,防止多个线程同时通过第一次检查后创建多个实例。 volatile
的必要性:instance = new DCLSingleton();
这行代码在 JVM 中实际包含三个步骤:- 分配内存空间。
- 调用构造函数初始化对象。
- 将引用赋值给
instance
。
- 由于 JVM 可能会对指令进行重排序,导致步骤执行顺序变为 1→3→2。在这种情况下,当一个线程执行完步骤 3 但还未执行步骤 2 时,另一个线程可能会判断
instance
不为null
,从而直接使用未初始化的实例,导致空指针异常。volatile
关键字可以禁止指令重排序,确保步骤按顺序执行。
特点
- 优点:线程安全,延迟初始化,性能高效(仅首次创建时加锁)。
- 缺点:实现稍复杂,需正确使用
volatile
。 - 适用场景:大多数需要延迟初始化且性能敏感的场景(如网络管理器)。
一、核心优点
1. 确保全局唯一实例
- 避免资源重复创建:通过控制实例数量,防止多次初始化造成的资源浪费(如数据库连接、网络请求对象、配置管理器等)。
例:在 Android 中,若多次创建网络管理器实例,可能导致连接池混乱或内存占用翻倍。 - 状态全局统一:单例的唯一实例可维护全局共享状态,确保不同模块访问的是同一数据(如用户登录状态、应用主题配置)。
2. 提供全局访问点
- 简化调用逻辑:通过静态方法(如
getInstance()
)直接获取实例,无需在多个模块间传递对象引用,降低代码耦合度。
例:在工具类(如日志工具、Toast 管理类)中使用单例,可在任意位置直接调用,无需频繁传递实例。
3. 延迟或提前初始化控制
- 灵活的初始化策略:
- 饿汉式:类加载时立即初始化,适合资源占用小、需提前准备的场景(如全局配置类)。
- 懒汉式 / DCL:首次使用时创建实例,节省内存,适合资源占用大、非高频使用的场景(如图片加载引擎)。
4. 线程安全可控
- 通过合理设计(如
synchronized
、volatile
、类加载机制),可在多线程环境下保证实例唯一性,避免竞态条件。
例:DCL 模式通过双重检查和volatile
关键字,在高效的同时确保线程安全。
二、主要缺点
1. 内存泄漏风险(尤其在 Android 中)
- 上下文持有问题:若单例持有短生命周期对象(如
Activity
上下文),可能导致 Activity 无法被回收,引发内存泄漏。
// 反例:单例持有 Activity 上下文(Activity 销毁后仍被引用)
public class BadSingleton {private Context context;private static BadSingleton instance;private BadSingleton(Context context) {this.context = context; // 若传入 Activity 上下文,会导致泄漏}// 正确做法:使用 Application 上下文(生命周期与应用一致)
}
2. 违反单一职责原则
- 单例类可能承担 “创建实例” 和 “业务逻辑” 的双重职责,甚至演变为 “上帝类”,增加维护难度。
例:若网络单例同时处理请求、缓存、日志记录,职责过于复杂,违背 SRP(单一职责原则)。
3. 不利于单元测试
- 全局状态难以模拟:单例的实例一旦创建,测试时难以替换为模拟对象,导致测试依赖真实环境(如数据库、网络)。
解决方案:通过依赖注入(如 Hilt、Dagger)或接口抽象,将单例替换为可模拟的对象。
4. 多线程复杂度与性能开销
- 线程安全实现成本:懒汉式需额外同步机制(如
synchronized
),可能导致性能瓶颈(如直接同步方法的低效率);DCL 模式虽优化性能,但需正确使用volatile
避免指令重排序。 - 初始化阻塞风险:若单例构造函数包含耗时操作(如文件读取、网络请求),可能阻塞主线程(尤其在 Android 的 UI 线程中)。
5. 不利于扩展与继承
- 单例类通常通过私有构造函数禁止外部实例化,子类无法通过常规方式继承(除非通过反射破解,但破坏封装性)。
6. 全局状态引发的副作用
- 单例的状态修改可能影响所有调用方,难以追踪问题根源(类似全局变量的弊端)。
例:若单例的配置参数被意外修改,可能导致多个模块出现异常,且排查困难。
三、适用场景
- 资源共享且唯一的场景:
- 全局管理器(如网络管理器、数据库助手、文件缓存工具)。
- 配置中心、日志系统、主题管理等需要全局统一的模块。
- 实例创建成本高的场景:
- 若对象初始化涉及复杂逻辑或耗时操作(如读取大文件、建立网络连接),单例可避免重复开销。
- 简单工具类:
- 轻量工具类(如加密工具、屏幕适配工具),通过单例提供便捷访问入口。
感谢观看!!!
相关文章:
Android 单例模式全解析:从基础实现到最佳实践
单例模式(Singleton Pattern)是软件开发中常用的设计模式,其核心是确保一个类在全局范围内只有一个实例,并提供全局访问点。在 Android 开发中,单例模式常用于管理全局资源(如网络管理器、数据库助手、配置…...
Redis GEO
Redis GEO 引言 Redis GEO是Redis数据库中的一种高级功能,允许用户存储地理位置信息并执行基于地理空间查询的操作。本文将详细介绍Redis GEO的基本概念、使用方法以及在实际应用中的优势。 基本概念 GEO编码 GEO编码是指将地理位置信息(如经纬度&a…...
vulnhub-serile靶机通关攻略
下载地址:https://www.vulnhub.com/entry/serial-1,349/ 靶机安装特殊,附带安装参考文章:https://zhuanlan.zhihu.com/p/113887109 扫描IP地址 arp-scan -l扫描端口 nmap -p- 192.168.112.141访问80端口 线索指向cookie cookie是base64编…...
SAP-ABAP:OData 协议深度解析:架构、实践与最佳应用
OData 协议深度解析:架构、实践与最佳应用 一、协议基础与核心特性 协议定义与目标 定位:基于REST的开放数据协议,标准化数据访问接口,由OASIS组织维护,最新版本为OData v4.01。设计哲学:通过统一资源标识符(URI)和HTTP方法抽象数据操作,降低异构系统集成复杂度。核心…...
408 计算机网络 知识点记忆(3)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
java学习笔记10——集合框架
枚举类的使用 Collection接口继承树 Map接口继承树 Collection 接口方法 总结: 集合框架概述 1.内存层面需要针对于多个数据进行存储。此时,可以考虑的容器有:数组、集合类2.数组存储多个数据方面的特点:> 数组一旦初始化,其长度就是确定的…...
埃文科技企业AI大模型一体机——昇腾体系+DeepSeek+RAG一站式解决方案
面对企业级市场海量数据资产与复杂业务场景深度耦合的刚需,埃文科技重磅推出基于华为昇腾算力DeepSeek大模型的企业一体机产品,提供DeepSeek多版本大模型一体机选择,为企业提供本地昇腾算力DeepSeek大模型RAG知识库的一体化解决方案ÿ…...
蓝桥杯---BFS解决FloofFill算法1---图像渲染
文章目录 1.算法简介2.题目概述3.算法原理4.代码分析 1.算法简介 这个算法是关于我们的floodfill的相关的问题,这个算法其实从名字就可以看出来:洪水灌溉,其实这个算法的过程就和他的名字非常相似,下面的这个图就生动的展示了这个…...
个人博客网站从搭建到上线教程
步骤1:设计个人网站 设计个人博客网站的风格样式,可以在各个模板网站上多浏览浏览,以便有更多设计网站风格样式的经验。 设计个人博客网站的内容,你希望你的网站包含哪些内容如你的个人基本信息介绍、你想分享的项目、你想分享的技术文档等等。 步骤2:选择开发技术栈 因…...
【FreeRTOS】裸机开发与操作系统区别
🔎【博主简介】🔎 🏅CSDN博客专家 🏅2021年博客之星物联网与嵌入式开发TOP5 🏅2022年博客之星物联网与嵌入式开发TOP4 🏅2021年2022年C站百大博主 🏅华为云开发…...
力扣每日一题:2712——使所有字符相等的最小成本
使所有字符相等的最小成本 题目示例示例1示例2 题解这些话乍一看可能看不懂,但是多读两遍就明白了。很神奇的解法,像魔术一样。 题目 给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标…...
Java EE(17)——网络原理——IP数据报结构IP协议解析(简述)
一.IP数据报结构 (1)版本:指明协议的版本,IPv4就是4,IPv6就是6 (2)首部长度:单位是4字节,表示IP报头的长度范围是20~60字节 (3)8位区分服务:实际上只有4位TOS有效,分别是最小延时,最…...
Pycharm运行时报“Empty suite”,可能是忽略了这个问题
问题:使用Pycharm运行testcases目录下的.py文件,报“Empty suite”,没有找到测试项。 排查过python解释器、pytest框架安装等等,依然报这个错,依然没找到,最后终端运行: pytest test_demo.py&a…...
Linux快速安装docker和docker-componse步骤
在 CentOS 7 上安装 Docker 和 Docker Compose 的步骤如下: 1. 安装 Docker 1.1. 更新系统 首先,确保你的系统是最新版本: sudo yum update -y1.2. 安装必要的包 安装 yum-utils,这是管理 YUM 源的工具: sudo yu…...
OP2177运算放大器:高性能模拟信号处理的关键元件
在现代电子系统中,模拟信号处理至关重要,运算放大器作为模拟电路的核心部件,其性能优劣直接影响系统的整体表现。OP2177 是一款具有卓越性能的运算放大器,在众多领域有着广泛应用。以下将结合相关资料,对 OP2177 进行全…...
paddle ocr
paddle ocr paddle ocr笔记准备工作referenceto onnx文本检测文本检测文字识别 paddle ocr笔记 准备工作 下载字典ppocr_keys_v1.txt,下标从1开始模型转换 reference paddlepaddle to onnx 下载模型,或者直接使用python跑一下并且把本地模型拿过来…...
通过动态获取项目的上下文路径来确保请求的 URL 兼容两种启动方式(IDEA 启动和 Tomcat 部署)下都能正确解析
背景 因为在不同的启动环境下,获取上下文路径的方式需要有所调整。在 IDEA 中运行时,路径是基于当前页面的 URL(如 index.html),而在 Tomcat 部署时,它是基于项目上下文路径(如 ssm-project&am…...
Spring Boot 整合 ElasticJob 分布式任务调度教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 整合 ElasticJob 分布式任务调度教程 一、ElasticJob 简介 ElasticJob 是当当网开源的分布式任务调度解决方案,支持: …...
Django项目之订单管理part6(message组件和组合搜索组件)
一.前言 我们前面讲的差不多了,接着上节课讲,今天要来做一个撤单要求,我们可以用ajax请求,但是我这里介绍最后一个知识点,message组件,但是我会把两种方式都讲出来的,讲完这个就开始讲我们最重…...
[MySql] 多表关系, 多表查询
一. 多表关系 1.1 一对多 例如: 员工 - 部门表 (一个部门可以有多个员工) 并且在多的一方增加一个字段关联一的一方的主键. 外键约束: 物理外键 (使用 foreign key 定义外键关联另一张表的主键) 缺点: 影响增删改效率; 仅用于单节点, 不适用与集群; 易引发死锁, 性能低; …...
Open GL ES ->GLSurfaceView在正交投影下的图片旋转、缩放、位移
XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…...
一文详解QT环境搭建:Windows使用CLion配置QT开发环境
在当今的软件开发领域,跨平台应用的需求日益增长,Qt作为一款流行的C图形用户界面库,因其强大的功能和易用性而备受开发者青睐。与此同时,CLion作为一款专为C/C打造的强大IDE,提供了丰富的特性和高效的编码体验。本文将…...
MSTP和链路聚合
MSTP 802.1S --- MSTP --- 多生成树协议 --- 就是在RSTP基础上,再针对链路利用率低问题进行优化,可以和RSTP以及STP向下兼容。 实例 --- Instance --- 可以理解为一个V LAN或者多个VALN的集合。一个交换网络可以针对一个实例创建一棵树,起到…...
每天学一个 Linux 命令(8):ls
大家好,欢迎来到《每天掌握一个Linux命令》系列。在这个系列中,我们将逐步学习并熟练掌握Linux命令,今天,我们要学习的命令是ls。 01 什么是ls命令 在Linux系统中,ls命令是“list”的缩写,其英文全称为“list directory contents”,即“列出目录内容”。该命令非常实用…...
交换机、路由器、VLAN、单臂路由、三层交换、STP
华为模拟安装 1.依次安装wincap 2.wireshark 3.virtual box 4.ensp 一、设置 1.virtual box设置 2.计算机防火墙允许以上程序 3.eNSP设置 路由器:AR2240 交换机:S5700、CE12800 防火墙USG6000V 交换机 一、交换机工作原理 1、回顾 二层交换机…...
算法 | 2024最新算法:斑翠鸟优化算法原理,公式,应用,算法改进研究综述,matlab代码
基于斑翠鸟优化算法的原理、应用及改进研究综述 一、算法原理 斑翠鸟优化算法(Pied Kingfisher Optimizer, PKO)是2024年由Bouaouda等人提出的一种新型仿生智能优化算法,其灵感来源于斑翠鸟的捕食行为与共生关系。算法通过模拟斑翠鸟的栖息悬停、潜水捕鱼及与其他生物的共生…...
六十天Linux从0到项目搭建(第二十二天)(pipe、管道四种场景)
1 关于 pipe 系统调用的解析 int pipe(int pipefd[2]) 是 Unix/Linux 系统中用于创建匿名管道的系统调用。以下是关于管道特点的详细解释: 输出型参数 pipefd[2] 是输出型参数,调用成功后: pipefd[0] 存放管道的读取端文件描述符 pipefd[1…...
数据安全与网络安全——问答复习
目录 1、请简要分析勒索软件攻击的原理,并给出技术防护⽅案。 勒索软件攻击原理: 技术防护⽅案 2、举例数据安全问题 数据泄露 数据篡改 数据丢失 3、如何应对数据安全问题 技术层⾯ 管理层⾯ 4、软件漏洞 产⽣原因: 缓冲区溢出漏洞: 注⼊漏…...
ESP-01模块连接手机热点问题及解决方法
在使用ESP-01模块连接手机热点时,可能会遇到一些问题。本文将详细介绍如何解决这些问题,并分享最终通过将WiFi切换到2.4GHz成功解决问题的经验。 一、问题描述 在尝试使用ESP-01模块连接手机热点时,遇到了连接失败的问题。以下是操作过程中…...
go中锁的入门到进阶使用
Go 并发编程:从入门到精通的锁机制 引言:为什么需要锁? Go 语言以其天生支持并发的特性深受开发者喜爱,但并发带来的问题也不容小觑,比如数据竞争、并发安全等。如果多个 Goroutine 访问同一个变量,没有做…...
JS判断对象是否为空的方法
在 JavaScript 中,判断一个对象是否为空对象(即没有自身可枚举属性),可以通过以下方法实现: 方法 1:使用 Object.keys() javascript function isEmptyObject(obj) {// 确保是普通对象(排除 n…...
idea导入tomcat的jar
概述 对于老项目,未使用 Maven/Gradle 管理依赖的,在需要编译 Servlet/JSP 代码时,需要手动添加 Tomcat JAR 依赖(如 servlet-api.jar)方能进行编绎。 步骤: 1、找到 Tomcat 的 JAR 文件 进入 Tomcat 安…...
Linux 下安装和使用 Jupyter Notebook
Jupyter Notebook / Lab 是 Python 开发和数据分析中不可或缺的工具。为了避免环境污染,推荐使用虚拟环境方式安装并启动它。本教程将教你如何: 安装 Python、pip、venv使用虚拟环境安装 Jupyter汉化安装实用插件设置登录密码启动并远程访问编写一个一键…...
【Ubuntu常用命令】
1.将本地服务器文件或文件夹传输到远程服务器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夹 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.从远程服务器传输文件到本地服务器 scp administrator10.60.51.20:/data/a.txt /h…...
UR机械臂sim2real推荐包
推荐一个和ur机械臂配套的interface: ur_rtde Universal Robots RTDE C Interface — ur_rtde 1.6.0 documentation 也欢迎大家提供新想法和bug...
HTTP协议深度解析详解
HTTP协议深度解析详解 一、HTTP协议基础架构 1.1 请求响应模型 #mermaid-svg-pAGwQipduFJRm11I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pAGwQipduFJRm11I .error-icon{fill:#552222;}#mermaid-svg-pAGwQipd…...
算法学习第十七天:LRU缓存与布隆过滤器
LRU缓存与布隆过滤器 目录 LRU缓存 基本概念实现原理C代码实现 布隆过滤器 基本概念实现原理C代码实现 LRU缓存 基本概念 LRU(Least Recently Used):最近最少使用策略,当缓存空间不足时,淘汰最久未被访问的数据。…...
html中img标签直接使用border-radius时会图片进行了遮挡
前言 该问题是我写完项目之后,UI走查发现的问题,虽然我也发现了问题,但是改起来,不好改,就耽搁了。后面UI还是要求要改。一直找不到解决方案,歪打正着通过MDN官网偶然看到的clip-path属性。 需求 一个图…...
【Keepalived】Keepalived-2.3.3明确结束对CentOS 7的支持
2025年3月30日,官方发布了Keepalived的最新版,版本号:2.3.3 而2024年11月3日发布的2.3.2版本,在CentOS 7.9上编译的时候,就出现了报错,但是在Alma Linux 8.10上,则可以成功编译安装,…...
Docker学习--容器生命周期管理相关命令--docker pause/unpause 命令
docker pause 命令的作用: 用于暂停一个或多个容器中的所有进程。 语法: docker pause CONTAINER [CONTAINER…](要操作的容器的名称,可以同时操作多个)。 实例: ①暂停一个容器及其所有进程:…...
【Zabbix技术系列文章】第④篇——Zabbix 数据可视化
在当今数字化运维时代,面对海量的监控数据,如何从中快速获取有价值的信息至关重要。Zabbix 的数据可视化功能为我们提供了直观、高效的解决方案,它能将复杂的监控数据转化为清晰易懂的图表和仪表盘,助力运维人员迅速发现问题、分析…...
R CSV 文件处理指南
R CSV 文件处理指南 引言 CSV(逗号分隔值)文件是一种常见的文件格式,它以纯文本形式存储表格数据。在R语言中,CSV文件处理是非常基础且重要的技能。本文将详细介绍如何在R中读取、处理和导出CSV文件,并探讨一些高级技…...
在Git仓库的Readme上增加目录页
一般在编写Readme时想要增加像文章那样的目录,方便快速跳转,但是Markdown语法并没有提供这样的方法,但是可以通过超链接结合锚点的方式来实现,如下图是我之前一个项目里写的Readme: 例如有下面几个Readme内容ÿ…...
[特殊字符]《多商户家政系统技术解析:SpringBoot+MyBatisPlus+UniApp高效实战指南》
🛠️ 引言:多商户家政系统的技术挑战与价值 在数字化时代,家政行业逐渐向线上迁移,从传统的线下预约转向平台化管理。多商户家政系统具备复杂的角色体系,包括: 🛎️ 商户端:管理订单…...
请求Header(Request Headers)详解
请求Header(Request Headers)详解 HTTP请求Header是HTTP请求消息的重要组成部分,用于在客户端和服务器之间传递附加信息。这些信息帮助服务器理解客户端的环境、偏好和请求的具体内容,从而能够返回更合适的响应。以下是对请求Hea…...
深度求索:开源革命下的AI普惠之路
引言:AI领域的破局者 2025年,全球AI领域因一家中国公司的崛起而震动。杭州深度求索(DeepSeek)推出的V3大模型以6710亿参数、14.8万亿token训练数据量,在数学竞赛、代码生成等专业领域超越多数国际竞品,其每…...
XSS 攻击(详细)
目录 引言 一、XSS 攻击简介 二、XSS 攻击类型 1.反射型 XSS 2.存储型 XSS 3.基于 DOM 的 XSS 4.Self - XSS 三、XSS 攻击技巧 1.基本变形 2.事件处理程序 3.JS 伪协议 4.编码绕过 5.绕过长度限制 6.使用标签 四、XSS 攻击工具与平台 1.XSS 攻击平台 2.BEEF 五…...
使用Redis实现轻量级消息队列
使用消息中间件如RabbitMQ或kafka虽然好,但也给服务器带来很大的内存开销,当系统的业务量,并发量不高时,考虑到服务器和维护成本,可考虑使用Redis实现一个轻量级的消息队列,实现事件监听的效果。下面介绍下…...
13届省赛python A组:10.数的拆分
题目1 数的拆分 给定 T 个正整数 ai,分别问每个 ai 能否表示为 x 1 y 1 ⋅ x 2 y 2 x1^{y1}⋅x2^{y2} x1y1⋅x2y2 的形式,其中 x1,x2 为正整数,y1,y2 为大于等于 2 的正整数。 输入格式 输入第一行包含一个整数 T 表示询问次数。 接下来…...
【Android Studio】下载安装过程(详细)
目录 一、前期准备 JDK下载安装 二、下载安装 下载 安装 启动 一、前期准备 JDK下载安装 详细的安装过程请移步我的另一篇博客jdk17详细安装步骤_jdk17安装教程详细-CSDN博客 cmd打开命令行,输入java -version验证,可以看到此处我安装的是java23。…...