【单例设计模式】揭秘单例模式:从原理到实战的全方位解析(开发者必读)
文章目录
- 深入理解单例设计模式:原理、实现与最佳实践
- 引言
- 第一部分:设计模式简介
- 第二部分:单例模式定义
- 第三部分:单例模式的优点和缺点
- 第四部分:单例模式的实现方式
- 懒汉式
- 非线程安全的实现
- 线程安全的实现(双重检查锁定)
- 饿汉式
- 静态内部类方式
- 枚举方式
- 静态工厂方法
- 枚举
- 第五部分:线程安全性
- 解释多线程环境中的问题
- 分析不同实现方式下的线程安全问题
- 懒汉式
- 饿汉式
- 提供解决方案和建议
- 第六部分:单例模式在实际项目中的应用
- 应用案例 1: 日志记录器
- 应用案例 2: 数据库连接池
- 应用案例 3: 配置管理器
- 第七部分:单例模式的最佳实践
- 如何避免滥用单例模式
- 如何处理单例模式与其他设计模式的结合
- 推荐的使用场景和注意事项
- 总结
深入理解单例设计模式:原理、实现与最佳实践
引言
在软件开发的过程中,我们经常会遇到需要全局唯一实例的情况。例如,配置管理器、日志记录器或是数据库连接池等,这些组件通常在整个应用程序中只需要一个实例,并且能够被所有组件共享访问。这时,单例设计模式就显得尤为重要。它不仅能够确保系统中某个类只有一个实例存在,还能提供一个全局访问点,从而简化了系统的设计。
为什么重要?
单例设计模式的重要性体现在以下几个方面:
- 资源优化:通过单例模式,我们可以确保系统中只有一个实例存在,这对于那些初始化代价较高且频繁使用的对象非常有用,比如数据库连接或文件系统操作。
- 全局访问:单例模式提供了一个全局的访问点,使得在任何地方都能轻松获取到同一个实例,这在需要频繁访问同一对象的情况下非常方便。
- 易于维护:由于整个系统中只有一个实例存在,因此当需要修改该实例的行为时,只需要在一个地方进行修改即可。
为什么需要了解?
对于软件开发者来说,了解并正确使用单例模式是非常重要的:
- 减少冗余:单例模式可以避免重复创建不必要的对象实例,从而减少了内存消耗。
- 提高效率:单例模式有助于提高程序的性能,特别是在那些创建成本较高的对象上。
- 易于控制:由于单例对象在整个系统中的唯一性,我们可以更容易地控制其生命周期以及行为。
- 代码可读性和可维护性:合理使用单例模式可以使代码更加清晰和易于理解。
然而,单例模式也有其局限性和潜在的问题,比如增加了系统的复杂度、可能引起多线程问题等。因此,正确理解和使用单例模式对于软件开发者而言至关重要。
第一部分:设计模式简介
可查这篇文章:【设计模式入门】设计模式全解析:23种经典模式介绍与评级指南(设计师必备)
里面详细讲了23设计模式的简介,可以快速了解设计模式
模式结构
单例模式包含如下角色:
- Singleton:单例
时序图
第二部分:单例模式定义
定义
单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问该实例。这意味着无论何时何地,只要需要该类的对象,都能得到同一个实例。这种模式通常用于那些需要频繁实例化的类,但又希望保持单一实例的情况下。
单例模式的核心思想和目标
核心思想:
- 保证唯一性:确保类的实例是唯一的。
- 全局访问:提供一个全局访问点来获取该实例。
目标:
- 资源节约:避免频繁创建和销毁对象所引起的性能开销。
- 统一管理:方便地管理共享资源或者全局配置等。
- 简化访问:通过一个全局访问点简化对对象的访问,不需要每次调用时都传递相同的参数。
单例模式适用的场景
- 系统配置:对于系统的配置信息,通常只需要加载一次,并在整个应用中保持不变,使用单例模式可以有效地管理这些配置信息。
- 日志记录:日志对象在整个应用程序中可能被多个模块使用,单例模式可以确保所有的日志操作都通过同一个日志对象来进行。
- 线程池管理:创建线程是一个相对耗时的操作,使用单例模式可以有效地管理线程资源,避免重复创建线程。
- 数据库连接:数据库连接是昂贵的资源,单例模式可以确保应用程序中只存在一个数据库连接实例,从而减少资源消耗。
- 缓存管理:缓存对象可以用来存储常用数据,以提高系统的响应速度,单例模式可以确保缓存对象的唯一性和一致性。
第三部分:单例模式的优点和缺点
优点
- 保证系统内存中该类只存在一个实例:
- 通过限制一个类只能有一个实例,单例模式能够确保系统中不会出现多个相同的对象实例,从而节省内存空间。
- 这对于那些创建成本高的对象尤其有用,例如数据库连接或大型配置对象。
- 允许对唯一实例进行受控访问:
- 单例模式提供了一个全局访问点,使得对单例对象的访问变得简单且可控。
- 这意味着可以通过单例类的方法来控制对象的行为,例如配置、状态更改等。
- 可以节省系统资源:
- 由于单例模式确保了类的实例是唯一的,所以可以避免重复创建和销毁对象带来的资源浪费。
- 这对于需要频繁访问的资源特别有用,如日志记录器或缓存管理器。
缺点
- 增加了系统的复杂度:
- 单例模式的实现通常需要特殊的构造函数和静态方法,这可能会使类的定义变得复杂。
- 在多线程环境中,还需要考虑线程安全的问题,这会增加额外的复杂性。
- 不利于单元测试:
- 单例模式使得在单元测试中模拟单例对象变得困难。
- 由于单例对象在整个系统中都是唯一的,所以在测试时很难隔离它们的行为,这可能导致测试变得复杂且难以维护。
- 可能导致程序变得难以维护:
- 当单例对象被广泛使用时,如果需要修改单例对象的行为,那么这种修改可能会影响到整个系统。
- 这种全局性的影响使得单例对象成为系统中的一个耦合点,从而降低了系统的可维护性。
小结
虽然单例模式具有明显的优点,但在实际使用中也需要谨慎考虑其潜在的缺点。开发者应该权衡这些优缺点,并根据项目的具体需求来决定是否采用单例模式。在某些情况下,替代的设计模式,如依赖注入,可能更适合。
第四部分:单例模式的实现方式
单例模式可以通过多种方式实现,每种方式都有其特点和适用场景。下面我们将分别介绍几种常见的实现方式。
懒汉式
懒汉式单例模式是在首次使用时才创建实例的模式。这种模式可以分为非线程安全和线程安全两种实现。
非线程安全的实现
这种实现方式简单易懂,但不是线程安全的,也就是说,在多线程环境下可能会出现问题。
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
线程安全的实现(双重检查锁定)
双重检查锁定(Double-Checked Locking, DCL)是一种优化的线程安全实现方式,它可以避免不必要的同步开销。
public class LazySingletonDCL {private volatile static LazySingletonDCL instance;private LazySingletonDCL() {}public static LazySingletonDCL getInstance() {if (instance == null) {synchronized (LazySingletonDCL.class) {if (instance == null) {instance = new LazySingletonDCL();}}}return instance;}
}
饿汉式
饿汉式单例模式是在类加载时就创建实例的模式。这种方式保证了线程安全性,但可能会造成资源浪费。
静态内部类方式
利用 Java 的静态内部类特性来实现饿汉式的单例模式,这种方式既实现了线程安全,又避免了在类加载时就创建实例。
public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}
枚举方式
枚举类型本身就是线程安全的,因此可以很自然地用来实现单例模式。
public enum EnumSingleton {INSTANCE;// 实例变量和方法...
}
静态工厂方法
静态工厂方法是另一种实现单例模式的方式,它使用静态方法来创建和返回实例。
public class StaticFactorySingleton {private static StaticFactorySingleton instance;private StaticFactorySingleton() {}public static StaticFactorySingleton getInstance() {if (instance == null) {instance = new StaticFactorySingleton();}return instance;}
}
枚举
枚举类型的单例模式实现简洁且线程安全。
public enum SingletonEnum {INSTANCE;// 实例变量和方法...
}
小结
以上介绍了几种常见的单例模式实现方式,每种方式都有其特点和适用场景。在选择合适的实现方式时,需要考虑到线程安全性、性能影响以及可维护性等因素。例如,双重检查锁定适合于需要高性能且保证线程安全的场合;而枚举方式则提供了最简洁的线程安全实现。
第五部分:线程安全性
解释多线程环境中的问题
在多线程环境中,单例模式的实现可能会遇到线程安全问题。主要的问题在于,如果没有适当的同步措施,多个线程可能同时尝试创建单例对象的实例,从而违反了单例模式的基本原则——保证一个类只有一个实例。
分析不同实现方式下的线程安全问题
懒汉式
- 非线程安全的实现:
- 当多个线程同时执行
if (instance == null)
判断时,可能会导致多个线程同时进入条件块并创建新的实例,破坏了单例性质。 - 例如,两个线程 A 和 B 同时发现
instance
为空,并各自创建了一个新的实例。
- 当多个线程同时执行
public class NonThreadSafeLazySingleton {private static NonThreadSafeLazySingleton instance;private NonThreadSafeLazySingleton() {}public static NonThreadSafeLazySingleton getInstance() {if (instance == null) {instance = new NonThreadSafeLazySingleton();}return instance;}
}
- 线程安全的实现(双重检查锁定):
- 在双重检查锁定中,第一次检查
instance
是否为空,如果为空才进行同步。 - 这样可以避免在
instance
已经创建后还进行同步,提高了性能。 - 但是,如果没有正确地使用
volatile
关键字,可能会导致线程安全问题。 - 如果
new
操作没有完成就返回了引用,其他线程可能会看到未完全构造的实例。
- 在双重检查锁定中,第一次检查
public class ThreadSafeLazySingleton {private volatile static ThreadSafeLazySingleton instance;private ThreadSafeLazySingleton() {}public static ThreadSafeLazySingleton getInstance() {if (instance == null) {synchronized (ThreadSafeLazySingleton.class) {if (instance == null) {instance = new ThreadSafeLazySingleton();}}}return instance;}
}
饿汉式
- 静态内部类方式:
- 利用 Java 的类加载机制保证了线程安全性。
- 当外部类第一次被加载时,静态内部类不会被加载,只有在第一次调用
getInstance()
方法时才会加载内部类并创建实例。 - 由于类加载机制本身是线程安全的,因此这种方式也是线程安全的。
public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}
- 枚举方式:
- 枚举类型的单例实现天生就是线程安全的。
- 枚举的构造函数会在 JVM 加载时由 JVM 自动保证线程安全地初始化。
- 因此,这种方式不需要额外的同步措施。
public enum SingletonEnum {INSTANCE;// 实例变量和方法...
}
提供解决方案和建议
- 使用
volatile
关键字:- 在懒汉式实现中使用
volatile
关键字来确保instance
变量的可见性和禁止指令重排序,从而避免了线程安全问题。
- 在懒汉式实现中使用
private volatile static ThreadSafeLazySingleton instance;
-
双重检查锁定:
- 适用于需要在运行时创建实例的懒汉式实现。
- 确保在多线程环境下也能正确地创建单例对象。
-
静态内部类方式:
- 推荐用于需要在类加载时创建实例的饿汉式实现。
- 这种方式不仅线程安全,而且避免了在类加载时就创建实例的性能损失。
-
枚举方式:
- 最简单的线程安全实现。
- 适用于不需要额外功能的简单单例实现。
小结
在多线程环境中,单例模式的实现需要特别注意线程安全问题。不同的实现方式有不同的优缺点,选择合适的方式取决于具体的应用场景和性能需求。使用枚举或静态内部类通常是较为推荐的做法,因为它们既简单又高效。
第六部分:单例模式在实际项目中的应用
单例模式在实际项目中有广泛的应用,下面列举了一些典型的使用场景,并分析了为什么在这些场景中选择使用单例模式。
应用案例 1: 日志记录器
案例描述:
在大多数应用程序中,日志记录是一项基本的需求。通常,我们需要记录错误、警告以及调试信息等。为了方便管理和统一配置,日志记录器通常被设计为单例。
为什么选择单例模式:
- 统一管理:通过单例模式,可以确保应用程序中只有一个日志记录器实例,这样可以集中控制日志级别、输出格式等配置。
- 简化访问:单例模式提供的全局访问点使得在程序的任何位置都可以轻松地记录日志信息。
- 资源节约:由于日志记录器通常需要频繁使用,单例模式可以避免多次创建和销毁实例所带来的资源浪费。
示例代码:
public class LoggerSingleton {private static LoggerSingleton instance;private Logger logger;private LoggerSingleton() {logger = Logger.getLogger("MyLogger");}public static LoggerSingleton getInstance() {if (instance == null) {synchronized (LoggerSingleton.class) {if (instance == null) {instance = new LoggerSingleton();}}}return instance;}public void log(String message) {logger.info(message);}
}
应用案例 2: 数据库连接池
案例描述:
数据库连接是昂贵的资源。为了提高性能,通常使用数据库连接池来管理连接,这样可以复用现有的连接而不是每次都需要新建一个。
为什么选择单例模式:
- 资源管理:连接池需要在整个应用程序中被共享,单例模式可以确保连接池被正确地管理。
- 效率提升:通过单例模式,可以避免每次查询时都创建新的数据库连接,从而提高了应用程序的整体性能。
- 统一配置:单例模式使得连接池的配置可以在一个地方进行,便于维护和调整。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.ConcurrentLinkedQueue;public class DBConnectionPoolSingleton {private static DBConnectionPoolSingleton instance;private ConcurrentLinkedQueue<Connection> availableConnections;private DBConnectionPoolSingleton(int poolSize) {availableConnections = new ConcurrentLinkedQueue<>();for (int i = 0; i < poolSize; i++) {try {Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");availableConnections.add(conn);} catch (SQLException e) {e.printStackTrace();}}}public static DBConnectionPoolSingleton getInstance(int poolSize) {if (instance == null) {synchronized (DBConnectionPoolSingleton.class) {if (instance == null) {instance = new DBConnectionPoolSingleton(poolSize);}}}return instance;}public Connection getConnection() {return availableConnections.poll();}public void releaseConnection(Connection conn) {if (conn != null) {availableConnections.add(conn);}}
}
应用案例 3: 配置管理器
案例描述:
应用程序通常需要读取配置文件中的信息,例如服务器地址、端口号、用户名密码等。为了方便管理这些配置信息,通常会设计一个配置管理器。
为什么选择单例模式:
- 全局访问:配置管理器需要在整个应用程序中被访问,单例模式可以确保配置信息的全局可用性。
- 减少开销:配置信息通常在应用程序启动时加载一次,之后不再变化。单例模式可以避免重复加载配置文件,从而减少了开销。
- 简化维护:所有的配置信息都在单例对象中维护,便于维护和更新。
示例代码:
import java.util.Properties;public class ConfigurationManager {private static ConfigurationManager instance;private Properties properties;private ConfigurationManager() {properties = new Properties();try {properties.load(ConfigurationManager.class.getResourceAsStream("/config.properties"));} catch (Exception e) {e.printStackTrace();}}public static ConfigurationManager getInstance() {if (instance == null) {synchronized (ConfigurationManager.class) {if (instance == null) {instance = new ConfigurationManager();}}}return instance;}public String getProperty(String key) {return properties.getProperty(key);}
}
小结
通过这些案例,我们可以看到单例模式在实际项目中的应用价值。它不仅能够简化代码结构,还可以提高资源的利用率,同时保证了系统的稳定性和可维护性。在选择使用单例模式时,开发者需要考虑其适用性和潜在的问题,并采取相应的措施来避免这些问题的发生。
当然可以。下面是关于单例模式最佳实践的详细内容:
第七部分:单例模式的最佳实践
单例模式虽然强大,但也容易被误用。下面是一些关于如何合理使用单例模式的最佳实践:
如何避免滥用单例模式
- 明确使用场景:
- 确定单例模式是否真的适合当前的场景。考虑是否真的需要一个全局唯一的实例,以及这个实例是否会被频繁地访问。
- 如果可以使用局部变量或依赖注入等其他方式来代替,应优先考虑这些替代方案。
- 避免过度依赖:
- 尽量减少代码对单例对象的直接依赖。过度依赖单例对象会导致代码耦合度过高,难以测试和维护。
- 考虑使用依赖注入框架来管理对象的生命周期,这可以提高代码的灵活性和可测试性。
- 考虑替代方案:
- 对于那些不需要全局唯一实例的场景,可以考虑使用工厂模式或依赖注入等其他设计模式来替代单例模式。
如何处理单例模式与其他设计模式的结合
- 与依赖注入结合:
- 即使使用单例模式,也可以通过依赖注入框架(如 Spring、Guice 等)来管理单例对象的生命周期。
- 这样可以在保证单例特性的基础上,提高代码的可测试性和解耦。
- 与工厂模式结合:
- 如果单例对象需要根据不同的情况进行创建,可以考虑使用工厂模式来创建单例对象。
- 例如,可以根据不同的配置文件或运行环境创建不同的单例实例。
推荐的使用场景和注意事项
- 推荐的使用场景:
- 全局配置:例如,配置管理器、日志记录器等需要在整个应用中共享且只需一个实例的组件。
- 资源管理:例如,数据库连接池、线程池等资源密集型对象。
- 状态跟踪:例如,全局的状态管理器,用于跟踪整个应用的状态信息。
- 注意事项:
- 避免全局状态:尽量减少对全局状态的依赖,因为这可能会导致不可预测的行为。
- 考虑线程安全性:在多线程环境中使用单例模式时,必须确保其实现是线程安全的。
- 避免紧耦合:尽量减少代码对单例对象的直接依赖,以降低耦合度。
- 考虑可测试性:
- 在设计单例模式时,要考虑如何使其易于单元测试。例如,可以考虑使用枚举或静态内部类的方式来实现单例,这些方式通常更容易测试。
- 如果可能,尽量使用依赖注入来管理单例对象,这样可以在测试时更容易地替换或模拟这些对象。
小结
单例模式是一种强大的工具,但在使用时需要注意其潜在的问题。遵循上述最佳实践可以帮助开发者合理地使用单例模式,避免其潜在的风险,同时提高代码的质量和可维护性。
当然可以。下面是关于结语部分的详细内容:
总结
在这篇文章中,我们深入探讨了单例设计模式的相关知识,包括其定义、核心思想、实现方式以及在实际项目中的应用。我们从以下几个方面进行了详细的讨论:
- 设计模式简介:解释了设计模式的基本概念,以及单例模式属于创建型模式。
- 单例模式定义:定义了单例模式,并解释了其核心思想和目标。
- 单例模式的优点和缺点:分析了单例模式的优势和潜在的缺点。
- 单例模式的实现方式:介绍了懒汉式、饿汉式、静态工厂方法等多种实现方式,并重点讨论了线程安全问题。
- 线程安全性:分析了不同实现方式下的线程安全问题,并提供了解决方案。
- 实际应用:展示了单例模式在实际项目中的几个典型应用案例。
- 最佳实践:给出了如何合理使用单例模式的建议,以及如何避免其潜在的问题。
对未来趋势的展望
随着软件开发领域的不断发展和技术的进步,设计模式也在不断进化和发展。未来的趋势可能包括:
- 更高级别的抽象:随着语言特性和框架的发展,未来的单例模式实现可能会变得更加简洁和高效。
- 容器化和微服务架构:在容器化和微服务架构中,单例模式的使用方式可能会有所不同,需要考虑服务间的通信和资源管理。
- 异步编程:随着异步编程的普及,如何在异步环境中正确地使用单例模式也是一个值得研究的方向。
虽然单例模式在很多情况下都非常有用,但它并不是适用于所有场景的灵丹妙药。实际上,设计模式领域非常广阔,还有许多其他模式值得学习和探索,例如工厂模式、策略模式、观察者模式等等。每种模式都有其独特的应用场景和优势,掌握更多的设计模式将有助于您成为一名更优秀的开发者。
鼓励读者在实际工作中积极应用所学的设计模式,并在遇到问题时灵活选择最适合的模式。同时,也建议读者深入研究设计模式背后的原理,以便能够更好地理解和适应不断变化的技术环境。
最后,希望本文能够帮助您更好地理解和使用单例设计模式,并激发您对其他设计模式的兴趣。感谢您的阅读!
本文详细介绍了23种设计模式的基础知识,帮助读者快速掌握设计模式的核心概念,并找到适合实际应用的具体模式:
【设计模式入门】设计模式全解析:23种经典模式介绍与评级指南(设计师必备)
相关文章:
【单例设计模式】揭秘单例模式:从原理到实战的全方位解析(开发者必读)
文章目录 深入理解单例设计模式:原理、实现与最佳实践引言第一部分:设计模式简介第二部分:单例模式定义第三部分:单例模式的优点和缺点第四部分:单例模式的实现方式懒汉式非线程安全的实现线程安全的实现(双…...
VTK8.2.0编译(Qt 5.14.2+VS2017)
VTK8.2.0编译(Qt 5.14.2VS2017) 关于Qt和MSVC的安装,可以参考文章(QtMSVC2017)。 本篇VTK在QtMSVC的配置下的编译。VTK 以8.2.0为例。 一、环境变量的配置 我们打开电脑的环境变量,可以看到没有Qt相关的…...
武汉流星汇聚:亚马逊跨境电商龙头,市场份额稳固,服务品质卓越
在全球跨境电商的版图上,亚马逊无疑是一颗璀璨的明星,以其庞大的市场规模、卓越的用户体验和强大的品牌影响力,稳居行业龙头地位。即便在诸多新兴跨境平台竞相崛起的背景下,亚马逊依然以其独特的优势,保持着难以撼动的…...
我出一道面试题,看看你能拿 3k 还是 30k!
大家好,我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k)、初级(10k)、中…...
opecv c++计算图像的曲率
公式 κ z x x ⋅ z y 2 − 2 ⋅ z x ⋅ z y ⋅ z x y z y y ⋅ z x 2 ( z x 2 z y 2 1 ) 3 / 2 \kappa \frac{z_{xx} \cdot z_y^2 - 2 \cdot z_x \cdot z_y \cdot z_{xy} z_{yy} \cdot z_x^2}{(z_x^2 z_y^2 1)^{3/2}}\newline κ(zx2zy21)3/2zxx⋅zy2−2⋅zx…...
鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版
融云完成针对“纯血鸿蒙”操作系统的 SDK 研发,HarmonyOS NEXT 版融云 IM SDK 已上线,开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。 发挥 20 年通信行业技术积累和领创品牌效应,融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业…...
【全国大学生电子设计竞赛】2022年D题
🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~...
【优秀python案例】基于python爬虫的深圳房价数据分析与可视化实现
现如今,房价问题一直处于风口浪尖,房价的上涨抑或下跌都牵动着整个社会的利益,即便是政府出台各种政策方针也只能是暂时抑制楼市的涨势,对于需要买房的人来说,除了关注这些变化和政策外,还有一个非常头疼的…...
vscode安装与配置本地c/c++编译调试环境
目录 (1)安装vscode和常用插件 1.下载安装vscode 2.安装常用插件 (2)本地安装和配置编译器 1.安装编译器 2.vscode配置编译器 第1种:全局配置 第2种:为当前项目个性化配置 (3ÿ…...
PCIe学习笔记(15)
设备就绪状态 (Device Readiness Status,DRS)消息 (Device Readiness Status (DRS) 是PCIe规范中引入的一种机制,旨在改进设备初始化和就绪状态的检测与报告。 在以往的PCIe版本中,系统通常依赖于固定的超时机制来判断设备是否已…...
Rust中的特殊类型所占的内存大小
可以使用std::mem:size_of获取类型大小: use std::mem::size_of;struct Journal(String, u32); trait Summary {} impl Summary for Journal {}fn main() {println!("普通结构体相关:");println!("{}", size_of::<&Journal&…...
【深度学习】变分自编码器 VAE,什么是变分?(1)
文章目录 1. 变分自编码器 VAEVAE的基本概念VAE的数学原理编码器解码器目标函数训练过程代码示例未来发展2. 变分推断变分推断(Variational Inference)变分推断的基本概念变分推断的目标变分下界(Evidence Lower Bound, ELBO)最大化变分下界变分推断的步骤3. 必读内容1. 变…...
宏编程:C++宏、Rust宏和Lisp宏比较
根据simondobson两篇文章(1、2),总结比较一下C宏 Rust宏和Lisp宏: Rust 宏:Rust 有两种类型的宏: 声明性宏:这些模式匹配参数来生成代码。 过程宏:这些宏执行从代码到代码的更一般…...
ChatGPT协助撰写研究论文的11种方法【全集】
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时,原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享,我们将谈谈 ChatGPT 在研究论文方面可…...
PEP 8 – Python 代码风格指南中文版(四)
何时使用尾随逗号 尾随逗号通常是可选的,但在创建一个只有一个元素的元组时是必须的。为了清晰起见,建议使用(技术上多余的)括号将其包围起来: # 正确的: FILES (setup.cfg,)# 错误的: FILES setup.cfg, 当尾随逗号…...
基于深度学习的适应硬件的神经网络
基于深度学习的适应硬件的神经网络设计旨在最大限度地利用特定硬件平台的计算和存储能力,提高模型的执行效率和性能。这些硬件包括图形处理单元(GPU)、张量处理单元(TPU)、现场可编程门阵列(FPGA࿰…...
上传音频文件
思路 1、自定义Upload 重点:<input ref{inputRef} type"file" accept{accept} onClick{e > e.stopPropagation()} onChange{uploadFile} multiple{multiple}/> 使用input标签设置type是file,将input元素通过forwardRef暴露给父组件&…...
Linux之jdk离线安装
下载地址 一、linux安装jdk8 1、上传,解压 cd /usr/local/java tar -zxvf jdk-10.0.2_linux-x64_bin.tar.gz2、修改配置 vim /etc/profile #在/etc/profile文件后面加上如下配置 export JAVA_HOME/usr/local/java/jdk-10.0.2 export JRE_HOME/usr/local/java/jd…...
JVM结构、架构与生命周期总结
【1】JVM结构 不同厂商的JVM产品 : 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天,Java程序的运行性能早已脱胎换骨,已…...
Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)
文章目录 前言2.3.3 管理分区2.3.3.1 增加分区2.3.3.2 删除分区2.3.3.3 恢复分区2.3.3.4 查看分区 2.3.4 设置分桶2.3.4.1 随机分桶(自 v3.1)2.3.4.2 哈希分桶2.3.4.2.1 优点2.3.4.2.2 如何选择分桶键2.3.4.2.3 注意事项 2.3.4.3 确定分桶数量 2.3.5 最佳…...
为什么有时候银行贷款审核会查大数据信用?
在申请银行贷款时,不少人会疑惑为何银行会深入审查申请人的大数据信用信息。这背后,其实是银行风险控制与精准决策的体现。 首先,大数据信用信用能全面反映申请人的信用状况 它不仅仅局限于传统的征信报告,还涵盖了消费行为、社交…...
LoRa无线通讯,让光伏机器人实现无“线”管理
光伏清洁机器人,作为光伏电站运维的新兴关键设备,已跃升为继组件、支架、光伏逆变器之后的第四大核心组件,正逐步成为光伏电站的标准配置。鉴于光伏电站普遍坐落于偏远无人区或地形复杂之地,光伏清洁机器人必须具备远程操控能力、…...
买流量卡要注意什么,这些冷知识你一定要懂!
买流量卡要注意什么?别总盯着价格看,还有一些隐形的冷知识得了解一下,今天这篇文章就是要告诉你一些流量卡中隐藏的冷知识。 一、首先,那些月租9元、19元的流量卡,大概率都是短期卡,虽然他们的资费便宜&a…...
【嵌入式】STM3212864点阵屏使用SimpleGUI单色屏接口库——(2)精简字库
一 开源库简介与移植 最近一个项目需要用12864屏幕呈现一组较为复杂的菜单界面,本着不重复造轮子的原则找到了SimpleGUI开源库。 开源地址:SimpleGUI: 一个面向单色显示屏的开源GUI接口库。 SimpleGUI是一款针对单色显示屏设计的接口库。相比于传统的GUI…...
《计算机网络》(第8版)第1章 概述 复习笔记
第 1 章 概述 一、计算机网络在信息时代中的作用 计算机网络的两个重要功能: 1 .连通性 指互联网上的用户之间是相互连通的。 2 .共享(资源共享) 资源共享可以是信息共享、软件共享,也可以是硬件共享。此…...
银行数据质量保障体系建设实践
引言 在数字化转型浪潮中,数据中台成为企业实现数据驱动决策的关键支撑。它不仅整合了企业内外部的数据资源,还通过数据共享与复用,提升了运营效率和业务创新能力。然而,随着数据量的激增和数据来源的多样化,如何确保…...
笔记小结:《利用Python进行数据分析》二进制数据格式存储与web交互
提示:此节内容仅作了解即可 目录 二进制数据格式 使用HDF5 读取Microsoft Excel文件 二进制数据格式 实现数据的高效二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。 Python 的 pickle 模块是一个用于序列化和反序列化 Python 对象结构的模块…...
电脑桌面图标变白了?3个方法20秒钟轻松解
电脑桌面图标变白了?3个方法20秒钟轻松解 ⚠️电脑桌面图标变白了,3种方法轻松解决 🚸方法一和方法二属于治标不治本的解决方法,但操作较为简单,在不同情况下有不成功的可能,方法三相对复杂一些,…...
数据治理,管什么?
元数据(Metadata):通俗地说就是描述数据的数据,比如数据的名称、属性、分类、字段信息、大小、标签等等。要做好数据的管理,元数据起到了举足轻重的作用。 参考数据(Reference Data)࿱…...
【前端】JavaScript入门及实战121-125
文章目录 121 滚轮事件122 键盘事件123 键盘移动div124 BOM125 History 121 滚轮事件 <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <style type"text/css">#box1 {width: 100px;h…...
大型信息类PC网站适合vue做吗/此网站不支持下载视频怎么办
2、解压缩tar -zxvf ffmpeg-2.0.1.tar.gz3、配置,生成Makefile./configure --enable-shared --disable-yasm--prefix/usr/local/ffmpeg如果执行结果不对,可以根据提示信息,并查看帮助,解决问题./configure--help4、编译安装makemake install5…...
中山做网站的/seo交流论坛seo顾问
**本题来自科创网** #include<iostream> using namespace std;int read()//输入函数,用于获取输入的数字(包括两位数和三位数等) {int x0,f1;char chgetchar();while(ch<0||ch>9){if(ch-)f-1;chgetchar();}while(ch>0&&ch<9){xx*10ch-0;chgetchar()…...
南京有哪些做网站的公司/360网站排名优化
问题 MediaConvert进行转码任务的时候,需要及时了解MediaConvert转码任务的状态。因为AWS设计成MediaConvert转码任务只能给AWS的服务监控平台CloudWatch发事件,这次就来说说怎么在CloudWatch上面配置对MediaConvert转码任务的监听。 步骤 MediaConve…...
在国内做博彩网站代理/成都本地推广平台
# _*_ coding: utf-8 _*_#---------------------------------------# 程序:把本地文件上传到七牛云服务器# 版本:0.1# 作者:liu jia# 日期:2014-01-07# 语言:Python 2.7#---------------------------------------impor…...
网站里面内外链接如何做/2022知名品牌营销案例100例
实验十四 课程学习总结 项目内容这个作业属于哪个课程(https://www.cnblogs.com/nwnu-daizh/)这个作业的要求在哪里(https://www.cnblogs.com/nwnu-daizh/p/11093584.html)课程学习目标掌握软件项目评审会流程;反思总结课程学习内容。1.结合本学期课程学习内容&…...
网站运营岗位介绍/百度交易平台官网
位图就是用ps操作的,就是像拍照一样,色彩丰富。位图是由像素(点)组成的, 优点:就是像拍照一样,色彩丰富。非常真实。 缺点:放大失真 矢量图是由直线,曲线,矩形,圆通过数…...