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

【单例模式】饿汉式、懒汉式、静态内部类--简单例子

单例模式是⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。

目录

一、单例模式

饿汉式

 静态内部类

懒汉式

反射可以破坏单例

道高一尺魔高一丈

枚举


一、单例模式

饿汉式

类⼀加载就创建对象,这种⽅式⽐较常用,但容易产⽣垃圾对象,浪费内存空间。

// 饿汉式
public class HungryMan {private HungryMan(){}private final static HungryMan HUNGRY = new HungryMan();public static HungryMan getInstance(){return HUNGRY;}
}

那么它是如何保证线程安全的呢?它是基于类加载机制避免了多线程的同步问题,但是如果类被不同的类加载器加载就会创建不同的实例。 

优点:线程安全,没有加锁,执⾏效率较⾼。
缺点:不是懒加载,类加载时就初始化,浪费内存空间。

 静态内部类

使用静态内部类来实现单例模式是一种非常优雅且线程安全的方式。

这种方法利用了Java类加载机制的特性,即静态内部类只有在被引用时才会被加载和初始化,从而实现了延迟加载的效果。同时,由于Java虚拟机在类加载的过程中,是单线程的,所以静态内部类初始化过程中的线程安全性得到了保证。

// 静态内部类
public class Holder {private Holder(){}public static class Inner{private static final Holder HOLDER = new Holder();}public static Holder getInstance(){return Inner.HOLDER;}
}

 在这个例子中,Holder 类是我们要实现单例的类。我们将其构造函数私有化,以防止外部代码直接通过 new Holder () 来创建实例。然后,我们创建了一个私有的静态内部类 Inner ,它包含一个静态的 Holder 实例。外部代码无法直接访问这个内部类,但是可以通过调用 Holder .getInstance() 方法来获取单例实例。

Holder .getInstance() 方法被调用时,Inner 类会被加载和初始化(如果尚未加载的话),这个过程是由Java虚拟机在单线程环境中完成的,因此是线程安全的。在 Inner 类被初始化的过程中,静态变量 INSTANCE 会被创建,并且只会被创建一次。因此,Holder .getInstance() 方法总是返回同一个 Holder 实例,从而实现了单例模式。

懒汉式

懒汉式是一种单例模式的实现方式。这种方式的核心思想是延迟加载,也就是在真正需要使用到实例对象时才进行创建,而不是在程序启动时就创建。这种方式可以节省系统资源,提高程序的运行效率。

在懒汉式单例模式中,会将对象的创建过程放到一个静态方法中,并在这个方法中进行同步控制,以保证在多线程环境下仍然只创建一个实例。当程序第一次调用该方法时,会检查实例是否已经创建,如果没有,则进行创建;如果已经创建,则直接返回已经创建的实例。

// 懒汉式
public class LayMan {private LayMan(){}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{LayMan.getInstance();}).start();}}
}

那么它是如何保证线程安全呢?通过 synchronized 关键字加锁保证线程安全, synchronized 可以添加在⽅法上⾯,也可以添加在代码块上⾯,存在的问题是每⼀次调⽤ getInstance 获取实例时都需要加锁和释放锁,这样是⾮常影响性能的。

在单线程下使⽤没有问题,但是, 对于多线程是⽆法保证单例的

懒汉式单例模式的主要优点是它的延迟加载特性,可以在系统启动时减少不必要的资源消耗。然而,由于需要进行同步控制,懒汉式单例模式在多线程环境下的性能可能会受到一定影响。此外,如果实现不当,懒汉式单例模式也可能会存在线程安全问题。

---》优点:懒加载,缺点:线程不安全

但是还是不安全,可以通过反射来破坏单例。

反射可以破坏单例

反射破坏单例模式的方式主要是通过访问并调用类的私有构造函数来创建新的实例。在单例模式中,通常会将构造函数设为私有,以防止外部代码创建类的多个实例。然而,使用Java反射API,可以绕过这些访问限制。

具体来说,反射破坏单例模式的步骤如下:

  1. 获取单例类的Class对象。这可以通过调用Class.forName()方法或使用.class语法来完成。

  2. 使用Class对象的getDeclaredConstructor()方法来获取私有构造函数的Constructor对象。这个方法可以访问类中的所有构造函数,无论它们是公有还是私有。

  3. 调用Constructor.setAccessible(true)方法来允许访问私有构造函数。这将取消Java语言的访问检查,使得即使构造函数是私有的,也可以被调用。

  4. 最后,使用Constructor.newInstance()方法来创建单例类的新实例。

这样,即使单例类的构造函数是私有的,也可以通过反射来创建多个实例,从而破坏单例模式的约束。

(1)

import java.lang.reflect.Constructor;// 懒汉式
public class LayMan {private LayMan(){}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) throws Exception {LayMan instance1 = LayMan.getInstance();Constructor<LayMan> declaredConstructor = LayMan.class.getDeclaredConstructor();declaredConstructor.setAccessible(true);LayMan instance2 = declaredConstructor.newInstance();System.out.println(instance1);System.out.println(instance2);}
}

从代码运行结果可以看的,拿到了两个不同的实例: 

(2)

import java.lang.reflect.Constructor;// 懒汉式
public class LayMan {private LayMan(){}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) throws Exception {Constructor<LayMan> declaredConstructor = LayMan.class.getDeclaredConstructor();declaredConstructor.setAccessible(true);LayMan instance2 = declaredConstructor.newInstance();LayMan instance3 = declaredConstructor.newInstance();System.out.println(instance3);System.out.println(instance2);}
}

从代码运行结果可以看的,拿到了两个不同的实例:  

道高一尺魔高一丈

(1)为了防止反射破坏单例模式,可以采取一些防御措施。例如,在构造函数中添加检查,如果已经存在实例,则抛出异常。

import java.lang.reflect.Constructor;// 懒汉式
public class LayMan {private LayMan(){synchronized (LayMan.class){if(layMan != null){throw new RuntimeException("不用试图使用反射破坏单例");}}}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) throws Exception {LayMan instance1 = LayMan.getInstance();Constructor<LayMan> declaredConstructor = LayMan.class.getDeclaredConstructor();declaredConstructor.setAccessible(true);LayMan instance2 = declaredConstructor.newInstance();System.out.println(instance1);System.out.println(instance2);}
}

(2)但是,简单的在构造方法里判断layMan是否是null,如果是通过反射创建的2个实例,就可以通过反射进行破坏了。

import java.lang.reflect.Constructor;// 懒汉式
public class LayMan {private LayMan(){synchronized (LayMan.class){if(layMan != null){throw new RuntimeException("不用试图使用反射破坏单例");}}}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) throws Exception {Constructor<LayMan> declaredConstructor = LayMan.class.getDeclaredConstructor();declaredConstructor.setAccessible(true);LayMan instance2 = declaredConstructor.newInstance();LayMan instance3 = declaredConstructor.newInstance();System.out.println(instance3);System.out.println(instance2);}
}

从代码运行结果可以看的,拿到了两个不同的实例:  

(3)红绿灯方法:设置一个标志位flag

但是,简单的在构造方法里判断l标志位flag是否被修改过,也可以通过反射进行破坏。

import java.lang.reflect.Constructor;// 懒汉式
public class LayMan {private static boolean flag = false;private LayMan(){synchronized (LayMan.class){if(flag == false){flag = true;} else {throw new RuntimeException("不用试图使用反射破坏单例");}}}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) throws Exception {
//    LayMan instance1 = LayMan.getInstance();Constructor<LayMan> declaredConstructor = LayMan.class.getDeclaredConstructor();declaredConstructor.setAccessible(true);LayMan instance2 = declaredConstructor.newInstance();LayMan instance3 = declaredConstructor.newInstance();System.out.println(instance3);System.out.println(instance2);}
}

(4)相应的,我们也可以通过反射对这个标志位flag进行修改。

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;// 懒汉式
public class LayMan {private static boolean flag = false;private LayMan(){synchronized (LayMan.class){if(flag == false){flag = true;} else {throw new RuntimeException("不用试图使用反射破坏单例");}}}private static volatile LayMan layMan;// 双层检测锁模式public static LayMan getInstance(){if(layMan == null){synchronized (LayMan.class){if(layMan == null){layMan = new LayMan();  // 不是一个原子性操作:分配内存空间、执行构造方法,初始化对象、把这个对象执行空间}}}return layMan;}public static void main(String[] args) throws Exception {
//    LayMan instance1 = LayMan.getInstance();Field f = LayMan.class.getDeclaredField("flag");f.setAccessible(true);Constructor<LayMan> declaredConstructor = LayMan.class.getDeclaredConstructor();declaredConstructor.setAccessible(true);LayMan instance2 = declaredConstructor.newInstance();f.set(instance2, false);LayMan instance3 = declaredConstructor.newInstance();System.out.println(instance3);System.out.println(instance2);}
}

从代码运行结果可以看的,拿到了两个不同的实例:  

枚举

另外,还可以通过枚举类来实现单例,因为枚举类在Java中是天然的单例,且能够抵御反射攻击。

import java.lang.reflect.Constructor;public enum EnumSingle {INSTANCE;public EnumSingle getInstance(){return INSTANCE;}
}class Test{public static void main(String[] args) {EnumSingle instance1 = EnumSingle.INSTANCE;EnumSingle instance2 = EnumSingle.INSTANCE;System.out.println(instance1);System.out.println(instance2);Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(null);declaredConstructor.setAccessible(true);EnumSingle instance3 = declaredConstructor.newInstance();System.out.println(instance3);}
}

从代码运行结果可以看的,拿到了两个不同的实例:  

并且也可以看到,枚举类里是没有一个无参构造方法的。

在Java中,枚举类保证单例的方式是通过Java语言规范和Java虚拟机(JVM)的内部机制来实现的。具体来说,有以下几点保证了枚举类的单例特性:

  1. 语言级别的保障:Java枚举类型在设计时就被定义为单例的。Java语言规范中明确指出,枚举常量在Java中是由静态final字段表示的,它们在第一次被使用时初始化,并且由于它们是静态的,因此只会被初始化一次。

  2. 线程安全:枚举常量的加载和初始化是由JVM在类加载的过程中完成的,这个过程是线程安全的。由于Java虚拟机提供了类加载机制的安全性,因此不需要额外的同步措施来确保枚举常量的线程安全初始化。

  3. 反射的限制:即使使用Java反射API,也无法创建枚举的额外实例。尝试通过反射来调用枚举的构造函数会抛出异常,因为JVM不允许这样做。

  4. 序列化的安全性:枚举类默认实现了Serializable接口,并且在序列化时有着特殊的处理。即使枚举实例被序列化后再反序列化,也不会创建新的实例,而是返回已经存在的枚举常量。

  5. 单一实例的保证:由于枚举类型的特性,每个枚举常量在JVM中只有一个实例,不可能通过任何方式创建出第二个相同的实例。

因此,使用枚举实现单例模式是一种非常可靠的方法,它自动处理了多线程环境下的同步问题,并且防止了反射和序列化可能导致的单例破坏。

相关文章:

【单例模式】饿汉式、懒汉式、静态内部类--简单例子

单例模式是⼀个单例类在任何情况下都只存在⼀个实例&#xff0c;构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例&#xff0c;对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式 静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 一、单例…...

windows关闭Windows Search功能

我发现windows最恶心的功能就是自动更新和搜索。自动更新就是个毒瘤&#xff0c;得到了全世界的人讨厌。 而搜索功能难用、慢和造成卡死&#xff0c;根本没有存在的必要。并且他的windows search filter服务会在每次移动大量文件后建立索引&#xff0c;持续的占用cpu和硬盘的资…...

政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度

目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简述 在深度…...

免费的 ChatGPT、GPTs、AI绘画(国内版)

&#x1f525;博客主页&#xff1a;白云如幻❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚…...

UniApp 微信小程序:在 onLaunch 中等待异步方法执行完成后,再调用页面中的接口

最近遇到了一个问题&#xff1a;在 App.vue 中的 onLaunch 中调用登录接口时&#xff0c;由于异步登录尚未完成就调用了 index 页面的接口&#xff0c;导致 token 异常。如何确保页面在 App 中的 onLaunch 执行完毕后再继续执行呢&#xff1f; 在网上查阅了一些资料&#xff0c…...

【招贤纳士】长期有效

【招贤纳士】长期有效&#xff0c;有意者联系 一、SLAM算法工程师工作内容&#xff1a;任职资格&#xff1a; 二、规划算法工程师工作内容&#xff1a;任职资格&#xff1a; 三、感知算法工程师岗位职责&#xff1a;任职要求&#xff1a;加分项&#xff1a; 四、传感器系统工程…...

华为配置静态ARP示例

华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…...

LRTimelapse for Mac:专业延时摄影视频制作利器

LRTimelapse for Mac是一款专为Mac用户设计的延时摄影视频制作软件&#xff0c;它以其出色的性能和丰富的功能&#xff0c;成为摄影爱好者和专业摄影师的得力助手。 LRTimelapse for Mac v6.5.4中文激活版下载 这款软件提供了直观易用的界面&#xff0c;用户可以轻松上手&#…...

Java复习第十九天学习笔记(Cookie、Session登录),附有道云笔记链接

【有道云笔记】十九 4.7 Cookie、Session登录 https://note.youdao.com/s/VwpxfEim 一、会话技术简介 生活中会话 我&#xff1a; 小张&#xff0c;你会跳小苹果码&#xff1f; 小张&#xff1a; 会&#xff0c;怎么了&#xff1f; 我&#xff1a; 公司年会上要表演节目&a…...

HBase的数据模型与架构

官方文档&#xff1a;Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文&#xff0c;HBase建立在Hadoop之上&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于…...

卷积神经网络的结构组成与解释(详细介绍)

文章目录 前言 1、卷积层 2、激活层 3、BN层 4、池化层 5、FC层&#xff08;全连接层&#xff09; 6、损失层 7、Dropout层 8、优化器 9、学习率 10、卷积神经网络的常见结构 前言 卷积神经网络是以卷积层为主的深层网络结构&#xff0c;网络结构包括有卷积层、激活层、BN层、…...

使用ansible的连通性检查的关键参数

使用ansible进行ping命令的时候发现有些不通 ansible cba -m ping 10.1.1.1 | FAILED! > {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this h…...

Jenkins用maven风格build报错解决过程记录

1、Jenkins2.453新建项目&#xff0c;构建风格选的maven 2、自由风格构建部署没有任何问题&#xff0c;但是maven风格build一直失败&#xff0c;报错如下图 3、解决方案&#xff1a;在系统管理–系统配置–Maven项目配置&#xff0c;删除全局MAVEN_OPT的路径信息&#xff0c;…...

Web3.0与AI的交融:开启智能互联网新时代

目前有140 多个 Web3 AI 概念项目&#xff0c;覆盖了基础设施、数据、预测市场、计算与算力、教育、DeFi & 跨链、安全、NFT & 游戏 & 元宇宙、搜索引擎、社交 & 创作者经济、AI 聊天机器人、DID & 消息传递、治理、医疗、交易机器人等诸多方向。持续关注…...

自动化_Ansible学习笔记

文章目录 Ansible 介绍配置文件主配置文件优先级 常用命令ansible-playbook ad-hocinventory 主机清单Playbook 剧本YAML格式 ansible 模块介绍模块对应功能Commands modules(命令模块)command (命令)shell (外壳) 官方帮助文档 模块索引playbook 开头示例系统类setup (收集远程…...

用于密集视觉冲击的紧凑三维高斯散射Compact 3D Gaussian Splatting For Dense Visual SLAM

Compact 3D Gaussian Splatting For Dense Visual SLAM 用于密集视觉冲击的紧凑三维高斯散射 Tianchen Deng 邓天辰11Yaohui Chen 陈耀辉11Leyan Zhang 张乐妍11Jianfei Yang 杨健飞22Shenghai Yuan 圣海元22Danwei Wang 王丹伟22Weidong Chen 陈卫东11 Abstract 摘要 …...

ChatGPT揭秘:高效论文写作的秘籍

ChatGPT无限次数:点击直达 ChatGPT揭秘&#xff1a;高效论文写作的秘籍 引言 在当今信息爆炸的时代&#xff0c;高效撰写论文对于研究者和学术工作者至关重要。随着人工智能技术的不断发展&#xff0c;ChatGPT等自然语言处理工具的出现为论文写作提供了全新的思路和工具。本文…...

电脑不能上网,宽带调制解调器出现问题如何处理

目录 一、问题说明 二、解决方案 一、问题说明 内网的设备能互联&#xff0c;内网的各个设备无法连外网。 电脑在检测网络时&#xff0c;出现以下提示&#xff1a; 二、解决方案 首先重启光猫&#xff08;我们是电信宽带&#xff09;。 如果还是有问题&#xff0c;再重启…...

云计算: OVN 集群 部署分布式交换机

目录 一、实验 1.环境 2.OVN 集群 部署云主机 3.中心端添加DVS分布式大二层交换机 二、问题 1.南向控制器查看主机名只显示localhost 2.中心端如何添加DVR分布式⼤三层路由器 一、实验 1.环境 (1) 主机 表1 宿主机 主机架构软件主要服务IP备注ovn_central中心端 ovn…...

electron+Vue3构建桌面应用之IPC通讯

最近在做一个C/S架构的项目预研 过程中遇到 Electron 与 Vue3 通讯的问题&#xff0c;费劲巴力的在网上找方案&#xff0c;发现都不理想&#xff0c;最终攻克之后&#xff0c;计划将过程写下来&#xff0c;供有需求的同学白嫖&#xff01; 开始之前&#xff0c;先说一件重要的…...

html球体涨水

简单 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>div…...

ubuntu手动编译opencv 4.9.0遇到的问题汇总

ubuntu手动编译opencv 4.9.0遇到的问题汇总 编译流程 以4.9.0版本为例&#xff0c;可参考&#xff1a;https://docs.opencv.org/4.9.0/d2/de6/tutorial_py_setup_in_ubuntu.html 编译加速 https://blog.csdn.net/tfb760/article/details/104030841 ippicv_2021.10.0_lnx_i…...

SEO之搜索引擎的工作原理(三)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a;我给不会敲代码又想搭建网站的人建议 &#xff08;接上一篇。。。&#xff09; 排名 经过搜索引擎蜘蛛抓取页面&#xff0c;索引程序计算得到倒排索引后&#xff0c;搜索引擎就准备好可以随时处理用户搜索了…...

开发语言漫谈-python

python的语法和C完全不同&#xff0c;但是它也是C写的。也就是想成为高手&#xff0c;C是必备武功。不是每个人都想成为武林高手。所以客观上需要个简单上手开发效率高的语言&#xff0c;就这样python诞生了。python的发明人其实不喜欢蟒蛇&#xff0c;但是不知道为啥选这个名字…...

JVM指令收集

1. 栈和局部变量操作 1.1 将常量压入栈的指令aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入…...

小程序解析二维码:jsQR

1.了解jsQR jsQR是一个纯javascript脚本实现的二维码识别库&#xff0c;不仅可以在浏览器端使用&#xff0c;而且支持后端node.js环境。jsQR使用较为简单&#xff0c;有着不错的识别率。 2.效果图 3.二维码 4.下载jsqr包 npm i -d jsqr5.代码 <!-- index.wxml --> &l…...

【verilog 设计】 reg有没有必要全部赋初值?

一、前言 在知乎发现“reg有没有必要全部赋初值”这个问题&#xff0c;与自己近期对Verilog reg的进一步学习相契合&#xff0c;此文对这个问题进行总结。 二、reg的初值赋值方式 就语法意义赋初值而言&#xff0c;就是在声明reg时对其赋值。在工程中&#xff0c;对于数字系…...

NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估

目录 一、说明 二、Deepset SQUAD是个啥&#xff1f; 三、问答系统&#xff08;QA系统&#xff09;&#xff0c;QA系统在各行业的应用及基本原理 3.1 医疗 3.2 金融 3.3 顾客服务 3.4 教育 3.5 制造业 3.6 法律 3.7 媒体 3.8 政府 四、在不同行业使用QA系统的基本原理 五、关于…...

php开发中如何防止抓包工具伪造请求

要防止抓包工具伪造请求&#xff0c;采取一系列的技术和策略来增强应用程序的安全性。以下是一些关键步骤和最佳实践&#xff1a; 1. 使用HTTPS 确保应用程序使用HTTPS协议进行通信。HTTPS通过TLS/SSL加密客户端和服务器之间的数据传输&#xff0c;这使得抓包工具捕获到的数据…...

密码学 | 椭圆曲线数字签名方法 ECDSA(下)

目录 10 ECDSA 算法 11 创建签名 12 验证签名 13 ECDSA 的安全性 14 随机 k 值的重要性 15 结语 ⚠️ 原文&#xff1a;Understanding How ECDSA Protects Your Data. ⚠️ 写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留着学习。同时&#xff0c;经过几…...

wordpress数据库备份恢复/长春百度快速优化

目录 初始化 修改shape 切片操作 索引操作 mask操作 拼接操作 算术运算 求最值 数据类型转换 libtorch类似于pytorch的常见tensor操作。 初始化 包含一个很实用的方法: vector和tensor互转。 // 1. 常见的以固定值初始化方法 // pytorch是以[]表明尺度&#xff0c;…...

wordpress oauth qq/杭州网站优化推荐

文章目录读取文件操作dnslog平台盲注写入文件操作宽字节注入User-Agent注入Referer注入Cookie注入base64注入二次注入二次注入的危害mysql数据库在渗透过程中能够使用的功能还是比较多的&#xff0c;除了读取数据之外&#xff0c;还可以利用SQL注入漏洞对文件进行读写(但前提是…...

网站建设怎么购买空间/免费建网站的步骤

让你们对镜头的焦距有更多了解焦距是什么焦距的定义并不是镜头的物理尺寸上的长短&#xff0c;而是在镜头对焦到无穷远时&#xff0c;镜头的光学中心到相机传感器的距离&#xff0c;在描述镜头时我们常用的单位是毫米(mm)。焦距就是一个能影响画面大小的重要参数。©Lucas …...

一个网站需要哪些技术/跨境电商培训

乐山市计算机学校是一所全日制中专学校&#xff0c;创建于1994年&#xff0c;学校占地166亩&#xff0c;位于历史文化名城、世界自然与文化双遗产所在地乐山市&#xff0c;2001年经四川省教育厅批准成立了四川乐山信息技术专修学院&#xff0c;现有在籍学生5000多人。2007年10月…...

什么网站做批发零食的很多/百度一下生活更好

说明&#xff1a;参照了Angular1.xes2015的中文翻译&#xff0c;并将个人觉得不合适、不正确的地方进行了修改&#xff0c;欢迎批评指正。架构&#xff0c;文件结构&#xff0c;组件&#xff0c;单向数据流以及最佳实践 来自toddmotto团队的实用编码指南 Angular 的编码风格以及…...

一流的苏州网站建设/sem竞价是什么意思

最近本人也就遇到了这样的事情。星期一一上班&#xff0c;老板把我叫到办公室&#xff0c;给了我一张光盘&#xff0c;然后告诉我里面是一个MSSQL的数据库备份文件&#xff0c;让我给还原一下&#xff0c;最后还特别嘱咐我&#xff0c;这个数据文件特别重要&#xff0c;让我想尽…...