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

百度做的网站后台怎么更新/cpm广告联盟平台

百度做的网站后台怎么更新,cpm广告联盟平台,注册网站建设开发,WordPress怎么做百度小程序在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧&#xf…

     在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧,经过戏剧性的转折和层层推进,我们将一步步揭开这一模式背后的秘密。

     首先,文章将串起时间的线索,带你重回单例模式的起源,理解它在软件工程历史中的地位。经过时间的流逝,单例模式不仅保持了其原有的魅力,而且随着新的编程语言和技术的发展,还展示出了新的活力和应用场景。

     接着,细致解码单例模式的基础结构,为你展现其底层的实现方式。通过对不同实现策略的探讨,我们会评估各自的优势和潜在风险,帮助你作出明智的设计选择。无论是饿汉式的立即加载,还是懒汉式的延迟兴建,或是静态内部类和枚举方式的现代演化,本文将在详尽的案例分析中,为你搭建一座走向单例模式深入理解的桥梁。

     文中还将精心打造实战场景,凸显单例模式在不同应用中的策略运用。从多线程的并发控制到资源访问的优化,从全局状态管理到服务类的持久化,单例模式如何巧妙地解决现实问题——这些都将在本文中一一揭晓。

     在“单挑编程世界”的冒险中,你将体验到单例模式的实践力量。面对代码的战场,这篇文章将成为你的秘密武器,助你披荆斩棘,挖掘单例模式背后藏匿的珍宝。无论你是设计模式的新手,还是寻求更高级理解的资深开发者,本文都将与你并肩作战,一起探索编程世界的深奥与精彩。

目录

一、初识

二、案例

 2.1 分析与实现-懒汉式

 2.2 分析与实现-静态内部类

 2.3 分析与实现-饿汉模式

 2.4 分析与实现-双重检查锁

 2.5 分析与实现-枚举

三、讲解

 3.1 功能

 3.2 范围

 3.3 调用顺序示意图

 3.4 优缺点

四、练习


一、初识

     单例模式的历史渊源可以追溯到上世纪90年代,当时设计模式的概念由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides等人在《设计模式:可复用面向对象软件的基础》一书中首次提出。

     最初的设计模式书籍中并没有明确提到单例模式,但许多后来的书籍和文章将其作为设计模式的一部分进行讨论和描述。单例模式的概念是为了解决在软件开发中需要创建一个全局唯一对象的问题。

     随着编程语言和技术的发展,单例模式逐渐成为软件工程领域的重要模式之一,并广泛应用于各种类型的应用程序和系统中。它在许多领域具有实际应用,包括但不限于以下几个方面:

     1. 资源管理单例模式常用于管理共享资源,例如数据库连接池、线程池、日志管理器等。通过使用单例模式,可以确保在整个应用程序中只有一个实例存在,从而有效地管理资源和提高性能。

     2. 配置管理单例模式在配置管理中也扮演着重要角色。例如,一个应用程序可能需要读取配置文件中的信息,并在整个应用程序中共享这些配置信息。通过使用单例模式,可以确保在整个应用程序生命周期中只有一个配置对象存在。

     3. 全局状态管理在某些情况下,需要在应用程序中维持一些全局状态数据,例如游戏中的玩家信息、应用程序的运行时状态等。通过使用单例模式,可以方便地访问和更新这些全局状态数据,并确保数据的一致性和唯一性。

     4. 日志记录单例模式常用于日志记录器的实现。通过使用单例模式,可以确保在整个应用程序中只有一个日志记录器实例,从而统一管理和记录日志信息。

     5. 缓存管理在需要缓存数据的场景中,单例模式可以用来实现缓存管理器。通过单例模式,可以确保整个应用程序中只有一个缓存管理器实例,提高缓存的效果和一致性。

     6. 节约内存和提高性能由于单例模式只创建一个实例,可以减少内存占用,并且在运行时能够提供更高的性能。这在需要频繁创建和销毁对象的场景中尤为重要,如线程池、网络连接等。

     7. 限制实例化和控制访问单例模式可以限制一个类只能创建一个实例,并提供一个统一的访问点。这可以防止其他对象直接实例化该类,从而增加了对实例化过程的控制和安全性。

     8. 模块化和解耦合单例模式可以帮助实现模块化和解耦合,在应用程序中以模块的形式组织和管理代码。单例模式将整个模块封装在一个类中,对外暴露统一的接口,使得模块之间的交互更清晰和简化。

        

二、案例

     场景:银行推出一个新的产品(就叫新产品了),通过获取个人缴纳部分的公积金额度乘以某倍数得到的总金额来作为准入的其中一个规则和计算授信额度的标准。

        ...

     最终,就是调某个接口(叫外部产品了)来获取客户的公积金信息。外部产品SDK说明第一步是实例一个Client,由Client负责组装数据、加密(解密)等然后发post请求来获取公积金信息。        

        

 2.1 分析与实现-懒汉式

     考虑到是尝试新产品和部分地区尝试上线、硬件软件、服务器性能情况等综合因素考虑选择使用懒汉式来实例化产品Client。

     实现示例代码:

public class LazySingleton {private static SdkClient sdkClient;private LazySingleton() {// 私有构造函数}public static synchronized SdkClient getInstance() {if (sdkClient == null) {sdkClient = new SdkClient();}return sdkClient;}
}

     在懒汉模式中,构造函数是私有的,确保外部无法直接实例化该类。getInstance() 方法返回单例对象的实例,并在首次调用时创建对象。 

     优点:

  • 延迟加载,最大限度地节省资源和提高性能。
  • 只有在需要时才会创建实例,适用于大型对象或高开销资源的情况。
  • 线程安全:通过同步处理来解决多线程环境下的竞态条件。

     缺点:

  • 需要考虑线程安全问题,可能需要使用同步机制,如使用synchronized关键字或通过双重检查锁定等。
  • 同步机制会增加额外的开销,可能会影响性能。
  • 可能存在序列化和反射攻击的漏洞,需要做相应的处理来防止。

         

 2.2 分析与实现-静态内部类

     静态内部类方式利用Java的类加载机制来实现懒汉式的延迟加载。

     实现示例代码:

public class StaticInnerSingleton {private StaticInnerSingleton() {// 私有构造函数}private static class SingletonHolder {private static final SdkClient instance = new SdkClient();}public static SdkClient getInstance() {return SingletonHolder.instance;}
}

     在这个示例中,私有的构造函数确保了外部无法直接实例化该类的对象。通过静态内部类SingletonHolder来持有单例对象,并且该类的实例化操作是在静态初始化阶段(即类加载时)完成的,保证了线程安全性。

     优点:

  1. 懒加载:单例对象的实例化在调用getInstance()方法时才会执行,实现了延迟加载的效果。

  2. 线程安全:由于静态内部类的特性,当多个线程同时访问getInstance()方法时,静态内部类的实例化操作只会执行一次,保证了线程安全性。

  3. 简洁性:相对于双重检查锁等方式,使用静态内部类实现单例模式的代码更加简洁明了。

     缺点:

  1. 需要了解并理解静态内部类的工作原理:虽然使用静态内部类实现单例模式代码相对简洁,但是理解这种实现方式的工作原理可能需要一定的知识和经验。对于不熟悉静态内部类的开发者来说,可能需要花费一些时间来理解其背后的概念和实现细节。

  2. 不支持传递参数的实例化:静态内部类实现的单例模式无法直接传递参数给单例对象的构造函数,因为静态内部类的实例化是在类加载时完成的。如果需要传递参数的实例化,可能需要使用其他方式实现。

  3. 需要额外的类:使用静态内部类实现单例模式需要额外定义一个静态内部类来持有单例对象,这增加了代码中的类数量。虽然这对于代码的组织和结构有一定的好处,但对于一些简单的应用场景来说可能显得有些冗余。

  4. 序列化和反序列化的处理:如果单例对象需要支持序列化和反序列化操作,需要额外处理,否则在反序列化时会得到不同的实例。可以通过实现readResolve()方法来解决这个问题。

        

 2.3 分析与实现-饿汉模式

     因为支行的各种软件产品的建设都要报备到省总部,由于历史某种原因,以前报软件产品比较少。所以好多产品都集成一个应用上,一个应用几乎每有新功能需要上线(这种频繁上线方式肯定是不建议的,但有时候又是非常必须的),导致某天第一个客户经理办业务时失败,查原因是实例化和发post请求超时了(内网向外网发请求,网络上做了好多层的代理转发)。小白就想着,那就修改一下外部产品Client的实例化方式吧。

     痛点:第一个应用加载太慢导致业务办理失败。

     实现示例代码:

public class EagerSingleton {private static final SdkClient sdkClient = new SdkClient();private EagerSingleton() {// 私有构造函数}public static SdkClient getInstance() {return sdkClient;}
}

     在饿汉模式中,单例实例在类加载时就被创建,并且是静态的、final的常量。getInstance() 方法直接返回该实例,而无需进行额外的创建过程。

     由于在类加载时就创建了单例实例,因此在多线程环境中是线程安全的,不需要额外处理同步问题。

     优点:

  • 线程安全:由于在类加载时就创建实例,因此不会存在多线程并发访问创建实例的问题,无需考虑同步和线程安全。
  • 简单明了:代码相对较为简单,不需要额外的同步处理,逻辑清晰。

     缺点:

  • 资源浪费:在某些情况下,如果单例对象的创建和初始化比较耗时,而且在程序的整个生命周期中可能并不会被立即使用,就会造成资源的浪费。
  • 引入不必要的依赖:饿汉模式可能会在应用启动时加载大量实例,增加了启动时间,还可能引入不必要的依赖关系。

        

 2.4 分析与实现-双重检查锁

     有段时间发现服务器出现频繁的GC,排查发现大量的实例使用比较少但是又不能没有,其中就有外部产品Client对象。最近服务器和网络都做了调优,再加上产品已大量推广使用,在某一些高峰期可会存在大量并发的情况等等种种原因综合考虑。小白就想着,那就修改一下外部产品Client的实例化方式吧。用双重检查锁来实现实例化外部产品Client对象。

     实现示例代码:

public class DoubleCheckedSingleton {private volatile static SdkClient sdkClient;private DoubleCheckedSingleton() {// 私有构造函数}public static SdkClient getInstance() {if (sdkClient == null) {synchronized (SdkClient.class) {if (sdkClient == null) {sdkClient = new SdkClient();}}}return sdkClient;}
}

     在双重检查锁模式中,通过在getInstance()方法中使用双重检查来确保只有在实例为null时才创建新的实例。

  • 第一次检查:检查实例是否已经创建,如果没有创建过,则进入同步块。
  • 第二次检查:在同步块中再次检查实例是否已经创建,这是为了避免在多个线程同时通过第一次检查的情况下,都进入同步块创建实例,从而造成多次实例化的问题。

     为了确保线程之间的可见性,需要使用volatile关键字修饰instance变量。volatile关键字的作用是禁止指令重排,保证每个线程都能正确看到instance变量的最新值,避免在多线程环境下出现问题。

     优点:

  • 延迟加载:双重检查锁可以在需要时才创建实例,避免了一开始就创建实例造成的资源浪费。
  • 提高性能:只有在第一次获取实例时才需要同步,后续获取实例时无需进行同步,提高了性能。

     缺点:

  • 使用双重检查锁实现单例模式仍然需要谨慎对待,确保代码正确性,代码的复杂性增加了维护和理解的难度,可能会导致潜在的bug。

        

 2.5 分析与实现-枚举

     实现示例代码:

public enum EnumSingleton {INSTANCE;private int value;EnumSingleton() {// 构造函数可以添加初始化逻辑value = 10;}public int getValue() {return value;}
}

     在这个示例中,EnumSingleton是一个枚举类,其中INSTANCE是唯一的枚举常量,代表了单例对象。在构造函数中,我们可以添加额外的初始化逻辑。在这里,我们将value初始化为10。

     假设在其他地方调用时,可以通过EnumSingleton.INSTANCE来获取初始对象,并调用其方法:

int value = EnumSingleton.INSTANCE.getValue();
System.out.println(value);  // 输出:10

     通过枚举类的常量INSTANCE获取到初始对象,然后可以调用其方法和访问其成员变量。 

     优点:

  • 线程安全:枚举实现的单例模式在创建实例时是线程安全的。枚举常量的实例化在类加载时完成,保证了全局只有一个实例,并且在多线程环境下也是安全的。
  • 防止反序列化创建新对象:枚举类默认实现了Serializable接口,并且枚举对象的反序列化操作不会创建新的对象。这使得枚举单例在涉及到序列化和反序列化的场景中更加安全。
  • 简单明了:使用枚举实现单例模式代码简洁明了,不需要编写复杂的线程安全逻辑或者使用双重检查锁等方式,只需声明一个枚举常量即可。

     缺点:

  • 不能延迟加载:枚举实现的单例模式在类加载时就完成了实例化,因此无法实现延迟加载的需求。如果应用在初始化时对资源消耗较大,无法延迟加载可能会影响应用的性能。
  • 有限的扩展性:枚举常量在枚举类中是固定的,无法在运行时动态地添加额外的枚举常量。这意味着枚举单例模式的扩展性相对受限,无法通过添加更多的实例来应对不同的需求。

        

三、讲解

     单例模式的本质:控制实例数目。

 3.1 功能

     单例模式是用来保证这个类在运行期间只会被创建一个类实例,另外,单例模式还提供了一个全局唯一访间这个类实例的访问点,就是getlnstance 方法。不管采用懒汉式还是饿汉式的实现方式,这 个全局访问点是一样的。

    对于单例模式而言,不管采用何种实现方式,它都是只关心类实例的创建问题,并不关心具体的业务功能。

        

 3.2 范围

     目前Java 里面实现的单例是一个虚拟机的范围。因为装载类的功能是虚拟机的,所以 一个虚拟机在通过自己的ClassLoader 装载饿汉式实现单例

类的时候就会创建一个类的实例。

     这就意味着如果一个虚拟机里面有很多个ClassLoader,而且这些ClassLoader 都装载某个类的话,就算这个类是单例,它也会产生很多个实例。当然,如果一个机器上有多个虚拟机的话,那么每个虚拟机里面都应该至少有一个这个类的实例,也就是说整个机器上就有很多个实例,更不会是单例了。

        

 3.3 调用顺序示意图

28ed1e5193c9427b921aa89335f9bfcf.png

         

 3.4 优缺点

     1. 时间与空间

  • 比较懒汉式和饿汉式:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
  • 饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断 了,节省了运行时间。

     2. 线程安全

  • 从线程安全性上讲,不加同步的懒汉式是线程不安全的。
  • 饿汉式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候是不会 发生并发的。
  • 如何实现懒汉式的线程安全,懒汉式也是可以实现线程安全的,只要在getInstance()方法上加上synchronized 即可。加上synchronized会降低整个访问的速度,而且每次都要判断。
  • 双重检查加锁,可以使用“双重检查加锁” 的方式来实现,就可以既实现线程安全,又能够使性能不受到很大的影响:并不是每次进入getlnstance 方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块这是第一重检查。进 入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile 修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。

        

四、练习

     请编写 Triple类,实现最多只能生成3个 Triple类的实例,实例编号分别为 0 , 1 , 2且可以通过 getInstance(int id)来获取该编号对应的实例。

相关文章:

探索设计模式的魅力:“感受单例模式的力量与神秘” - 掌握编程的王牌技巧

在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧&#xf…...

SpringCloud Aliba-Seata【上】-从入门到学废【7】

目录 🧂.Seata是什么 🌭2.Seata术语表 🥓3.处理过程 🧈4.下载 🍿5.修改相关配置 🥞6.启动seata 1.Seata是什么 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能…...

C# Cad2016二次开发选择csv导入信息(七)

//选择csv导入信息 [CommandMethod("setdata")] //本程序在AutoCAD的快捷命令是"DLLLOAD" public void setdata() {Microsoft.Win32.OpenFileDialog dlg new Microsoft.Win32.OpenFileDialog();dlg.DefaultExt ".csv";// Display OpenFileDial…...

[陇剑杯 2021]日志分析

[陇剑杯 2021]日志分析 题目做法及思路解析(个人分享) 问一:单位某应用程序被攻击,请分析日志,进行作答: 网络存在源码泄漏,源码文件名是_____________。(请提交带有文件后缀的文件名&…...

Java面试汇总——jvm篇

目录 JVM的组成: 1、JVM 概述(⭐⭐⭐⭐) 1.1 JVM是什么? 1.2 JVM由哪些部分组成,运行流程是什么? 2、什么是程序计数器?(⭐⭐⭐⭐) 3、介绍一下Java的堆(⭐⭐⭐⭐) 4、虚拟机栈(⭐⭐⭐⭐) 4.1 什么是虚拟机栈&…...

数据结构:完全二叉树(递归实现)

如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。 完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编…...

RK3568 移植Ubuntu

使用ubuntu-base构建根文件系统 1、到ubuntu官网获取 ubuntu-base-18.04.5-base-arm64.tar.gz Ubuntu Base 18.04.5 LTS (Bionic Beaver) 2、将获取的文件拷贝到ubuntu虚拟机,新建目录,并解压 mkdir ubuntu_rootfs sudo tar -xpf u...

C++大学教程(第九版)6.34猜数字游戏 6.35 修改的猜数字游戏

文章目录 6.34题目代码运行截图6.35题目代码运行截图 6.34题目 猜数字游戏)编写一个程序&#xff0c;可以玩“猜数字”的游戏。具体描述如下:程序在1~1000之间的整数中随机选择需要被猜的数&#xff0c;然后显示: 代码 #include <iostream> #include <cstdlib>…...

【立创EDA-PCB设计基础】5.布线设计规则设置

前言&#xff1a;本文详解布线前的设计规则设置。经过本专栏中的【立创EDA-PCB设计基础】前几节已经完成了布局&#xff0c;接下来开始进行布线&#xff0c;在布线之前&#xff0c;要设置设计规则。 目录 1.间距设置 1.1 安全间距设置 1.2 其它间距设置 2.物理设置 2.1 导…...

ElementUI简介以及相关操作

ElementUI是一套基于Vue.js的桌面端组件库&#xff0c;提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。以下是ElementUI的简介以及相关操作&#xff1a; 简介&#xff1a;ElementUI是一套为开发者、设计师和产品经理准备的基于Vue 2.0的桌面端组件库&#xff…...

内存耗尽排查思路

内存耗尽排查思路 – WhiteNights Site 标签&#xff1a;日志 内存间断性耗尽问题的排查思路 先简单说下背景。排查了两天给我整麻了。 找了个镜像模板做虚拟机。但是发现只要一开机&#xff0c;内存每隔几秒就会被耗尽。看内存的波形图就和坐过山车一样&#xff0c;一会占…...

OpenCV书签 #差值哈希算法的原理与相似图片搜索实验

1. 介绍 差值哈希算法&#xff08;Difference Hash Algorithm&#xff0c;简称dHash&#xff09; 是哈希算法的一种&#xff0c;主要可以用来做以图搜索/相似图片的搜索工作。 2. 原理 差值哈希算法通过计算相邻像素的差异来生成哈希&#xff0c;即通过缩小图像的每个像素与平…...

Unity中URP下获取主灯信息

文章目录 前言一、计算BulinnPhone的函数有两个重载1、 目前最新使用的是该方法&#xff08;这是我们之后主要分析的函数&#xff09;2、 被淘汰的老方法&#xff0c;需要传入一堆数据 二、GetMainLight1、Light结构体2、GetMainLight具有4个方法重载3、1号重载干了什么&#x…...

尝试着在Stable Diffusion里边使用SadTalker进行数字人制作

首先需要标明的是&#xff0c;我这里是图片说话类型&#xff0c;而且是看了知识星球AI破局俱乐部大航海数字人手册进行操作的。写下这篇文章是防止我以后遗忘。 我使用的基础软件是Stable Diffusion&#xff0c;SadTalker是作为插件放进来的&#xff0c;需要注意的是这对自己的…...

链路聚合原理与配置

链路聚合原理 随着网络规模不断扩大&#xff0c;用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中&#xff0c;常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽&#xff0c;但这种方案需要付出高额的费用&#xff0c;而且不够灵活。采用…...

第8章 通信网络安全

文章目录 8.1 信息系统安全概述8.1.1 信息系统的构成和分类8.1.2 信息系统安全1、信息系统中的安全概念2、信息系统安全问题的发展演变3、信息系统的安全结构 8.1.3 信息系统的安全保护等级1.TCSEC&#xff08;可信计算机系统评估准则&#xff09;2. 我国信息安全标准 8.1.4 通…...

L1-092 进化论(Java)

在“一年一度喜剧大赛”上有一部作品《进化论》&#xff0c;讲的是动物园两只猩猩进化的故事。猩猩吕严说自己已经进化了 9 年了&#xff0c;因为“三年又三年”。猩猩土豆指出“三年又三年是六年呐”…… 本题给定两个数字&#xff0c;以及用这两个数字计算的结果&#xff0c;…...

SpringBoot 源码解析5:ConfigurationClassPostProcessor整体流程和@ComponentScan源码分析

SpringBoot 源码解析5&#xff1a;ConfigurationClassPostProcessor整体流程和ComponentScan源码分析 1. 知道以下几点&#xff0c;读ConfigurationClassPostProcessor源码会更轻松2. 源码解析 ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry2.1 Configur…...

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍

目录 一.初识Linux 1.操作系统概述 计算机组成 硬件&#xff1a; 软件&#xff1a; 操作系统&#xff1a; 操作系统工作流程 操作系统作用 常见的操作系统 PC端&#xff1a; 移动端&#xff1a;&#xff08;掌上操作系统&#xff09; 一.初识Linux 2.Linux初识 linu…...

Eureka整合seata分布式事务

文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点&#xff1a;5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…...

华为云磁盘性能指标(参考)

MD[华为云磁盘性能指标(参考)] 云硬盘&#xff08;Elastic Volume Service, EVS&#xff09; 根据性能&#xff0c;磁盘可分为极速型SSD V2、极速型SSD、通用型SSD V2、超高IO、通用型SSD、高IO、普通IO。 性能指标(参考)&#xff0c;测速说明&#xff1a;操作系统-windows …...

利用OpenGL图形库实现人物动画移动效果

使用OpenGL库实现人物动画移动效果需要涉及到更复杂的图形编程和事件处理。以下是一个简单的例子&#xff0c;使用OpenGL和GLUT库实现人物的基本动画移动效果。 确保你已经安装了OpenGL和GLUT。你可以使用包管理器或者从官方网站下载并安装。 一、如果你已经安装过了OpenGL和…...

History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令)

目 录 一、history命令介绍 1、history命令是什么&#xff1f; 2、history的主要功能 二、history命令的用法 1、语法 2、选项说明 3、命令实例 三、history和历史记录文件bash_history 四、history命令的相关配置 1&#xff0c;命令带时间展示-HISTTI…...

apisix 单机部署 linux

安装etcd&#xff1a; cd /home/app rz tar -zxvf etcd-v3.5.4-linux-amd64.tar.gz cd etcd-v3.5.4-linux-amd64 vim start.sh内容&#xff1a; #!/bin/sh nohup etcd --name infra0 --initial-advertise-peer-urls http://127.0.0.1:2380 \--listen-peer-urls http://127.0.…...

Redis 面试题 | 06.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

2008年苏州大学837复试机试C/C++

2008年苏州大学复试机试 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0&#xff0c;X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充&#xff1a;个人觉得这个题目回忆…...

MySQL笔记-information_schema库中COLUMNS表的一些笔记

mysql建表中可以添加comment&#xff0c;也就是注释&#xff0c;这些注释会写到information_schema库的COLUMNS表中&#xff0c;可以使用如下SQL语句进行查询&#xff1a; SELECT COLUMN_NAME, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA your_data…...

归并排序模板

模板在文末&#xff0c;以下步骤方便理解记忆。 先贴一张快速排序模板步骤&#xff0c;用于对比记忆 归并排序步骤&#xff1a; &#xff08;0&#xff09;如果数组左边界L ≥ 数组右边界&#xff0c;则不需要排序&#xff0c;直接return。 &#xff08;1&#xff09;直接取…...

【NVIDIA】Jetson Orin Nano系列:安装 Qt6、firefox、jtop、flameshot

1、使用命令安装 sudo apt install qtcreator sudo apt install qt6-* sudo apt install libqt6* sudo apt install qml-qt6 sudo apt install qmlscene-qt6 sudo apt install assistant-qt6 sudo apt install designer-qt62、启动 qtcreator 3、常用工具安装 sudo apt in…...

Fastapi+Jsonp实现前后端跨域请求

文章目录 一、实现方法1.后端部分【Fastapi】2.前端部分【JS】二、测试一、实现方法 1.后端部分【Fastapi】 # coding:utf-8import json from fastapi import FastAPI, Response from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI(...