php常用设计模式之单例模式
设计模式是我们日常开发中最常用的编程模式之一,也是面试中最高频的考点之一。通过合理运用设计模式,可以使代码结构更加清晰、易于维护。通过这篇文章 我也讲一下设计模式中的单例模式,了解下它的原理和适用场景。
单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。它特别适用于需要共享资源的场景,比如数据库连接、日志记录、配置管理等,使得资源得以高效利用,避免重复创建带来的性能开销和不一致性。
要求
要实现单例模式,通常需要满足以下几个要求:
- 仅允许创建一个实例:确保一个类在整个应用中只存在一个实例。
- 提供全局访问点:通过一个全局方法提供唯一实例的访问,以便其他类可以随时获取。
- 控制实例的创建:避免直接通过
new
关键字创建实例,确保通过专门的方法来生成唯一实例。
原理
单例模式的核心原理在于将构造函数设为私有,从而阻止外部通过 new
创建实例。接下来,通过一个静态方法来检查类的实例是否已经存在:
- 私有化构造函数:通过将构造函数声明为
private
,防止外部类直接创建实例。 - 静态实例属性:在类内部使用一个静态属性来保存唯一实例,确保实例是共享的。
- 静态访问方法:定义一个公共的静态方法
getInstance()
,通过判断静态实例属性是否为null
来决定是否创建新的实例,如果已经存在则直接返回该实例。
为什么用单例模式
使用单例模式有以下几个关键原因:
- 控制资源消耗
单例模式能够有效避免重复创建资源实例的开销,尤其在涉及到数据库连接、缓存服务等重型资源时,通过确保这些实例的唯一性,可以大大减少系统的内存使用和性能消耗。 - 确保全局一致性
在一个应用中,某些对象需要在不同模块间共享且保持一致。例如,配置文件管理、日志管理等,通过单例模式,能够保证无论从哪里调用,获取的始终是同一个实例,避免数据不同步导致的问题。 - 简化系统设计
单例模式提供了一个简单的全局访问方式,通过一个静态方法即可轻松获取实例,减少了对外部模块的依赖和传递。同时,通过单例模式的控制,可以简化复杂系统中多个实例间的管理逻辑,提高代码的可读性和可维护性。 - 实现延迟加载
单例模式通常在首次使用时创建实例,这种延迟加载的方式确保资源只有在需要时才会被真正初始化,避免了不必要的资源占用,提高了应用启动时的效率。 - 降低系统复杂度
单例模式限制了某些类在整个系统中的实例数,便于管理。通过集中控制特定对象的创建和访问,简化了系统结构,提升了代码的健壮性,尤其是在大型系统中,单例模式可以显著降低复杂度。
单例模式的应用场景
单例模式适用于以下常见场景:
- 数据库连接池:在应用程序中,频繁创建和销毁数据库连接会造成性能开销。通过单例模式,数据库连接池可以保持一个全局连接实例,供整个应用程序共享,减少资源浪费。
- 配置管理:应用程序的配置通常是全局的,且在运行时不发生变化。单例模式可以确保配置类的唯一性,避免在不同模块中重复加载配置文件,提高访问效率。
- 日志记录:日志记录通常需要集中管理,在各个模块间共享同一个日志实例,确保日志输出的统一性。单例模式可以提供一个唯一的日志记录实例,方便全局访问。
- 线程池:对于需要并发执行的任务,线程池是一个常见的高效解决方案。通过单例模式来实现线程池,可以确保应用程序中只有一个线程池实例,避免了不必要的线程创建和销毁。
- 缓存管理:在使用缓存系统(如 Redis)时,通常只需要一个缓存管理实例来处理数据的缓存与读取。单例模式保证了缓存管理实例的唯一性,从而提高缓存访问效率。
单例模式的用法
在实际开发中,单例模式的实现方式主要有两种:懒汉式(Lazy Initialization)和饿汉式(Eager Initialization)。这两种方式的区别主要在于实例的创建时机。
懒汉式单例(Lazy Initialization)
懒汉式单例的特点是延迟加载,即只有在首次调用时才会创建实例。适用于那些需要节省系统资源且实例化过程比较耗时的情况。
懒汉式代码示例
<?php
class LazySingleton {// 用于保存单例实例的静态属性private static $instance = null;// 私有构造函数,防止外部实例化private function __construct() {echo "Lazy Singleton Instance Created\n";}// 获取实例的静态方法public static function getInstance() {if (self::$instance === null) {self::$instance = new LazySingleton();}return self::$instance;}// 禁止克隆和反序列化操作,确保单例private function __clone() {}private function __wakeup() {}
}
优点
- 延迟加载:实例只有在真正需要时才会被创建,节省了内存资源。
- 节省开销:在不使用时不会占用系统资源,特别适合一些初始化成本较高的实例。
缺点
- 线程安全问题:在多线程环境下,多个线程可能同时进入
getInstance()
方法,导致实例被多次创建,需要额外的同步处理。 - 代码复杂性:为了实现线程安全,通常需要增加锁机制,会增加实现的复杂度。
饿汉式单例(Eager Initialization)
饿汉式单例的特点是在类加载时就创建实例,不论是否使用,实例都会提前占用内存资源。这种方式适用于实例的创建耗时较短、需要立即使用的情况。
饿汉式代码示例
<?php
class EagerSingleton {// 提前创建唯一实例private static $instance = null;// 静态初始化实例private function __construct() {echo "Eager Singleton Instance Created\n";}// 提供全局访问点public static function getInstance() {return self::$instance;}// 在类加载时创建实例static function init() {self::$instance = new EagerSingleton();}
}// 初始化单例实例
EagerSingleton::init();
优点
- 线程安全:由于实例在类加载时即已创建,避免了多线程并发问题,不需要同步机制。
- 访问速度快:不需要检查实例是否存在,每次调用都直接返回已创建的实例。
缺点
- 内存占用:即使不使用该实例,也会占用内存,适用于内存消耗较小的对象。
- 不支持延迟加载:实例在类加载时就创建,无法按需加载,可能导致资源浪费。
如何选择懒汉式和饿汉式单例模式?
-
资源占用与系统启动时间
- 懒汉式:如果实例化的开销较大,并且只在特定情况下才会使用,可以选择懒汉式。这样可以节省系统启动时的资源,并且实例会在需要时才初始化。
- 饿汉式:适合实例化开销小且系统启动时必须立即使用的对象。提前加载确保了系统中随时可以访问该实例,适用于对响应速度要求高的场景。
-
多线程环境
- 懒汉式:在多线程环境下使用懒汉式,需要确保线程安全,否则可能会出现多次实例化的问题。这需要额外的同步机制,如双重检查锁(DCL)或
synchronized
方法,增加了实现的复杂性。 - 饿汉式:天然的线程安全,因为实例在类加载时就已创建。多线程环境中,饿汉式可以避免同步锁的问题。
- 懒汉式:在多线程环境下使用懒汉式,需要确保线程安全,否则可能会出现多次实例化的问题。这需要额外的同步机制,如双重检查锁(DCL)或
-
内存消耗
- 懒汉式:适合资源占用较大的情况,因为在不使用时不会占用内存。对内存敏感的系统,懒汉式可以更好地控制资源。
- 饿汉式:适合内存消耗较小的对象,提前实例化不会对系统造成太大负担。对于频繁访问的小型实例对象,饿汉式可以更高效。
-
代码复杂性
- 懒汉式:需要额外的同步机制来确保线程安全,增加了实现的复杂性,适合对多线程处理有经验的开发者。
- 饿汉式:实现简单,适合要求稳定、快速开发的场景。饿汉式不需要担心线程安全问题,代码更简洁。
总结选择策略
- 如果实例的初始化开销大,且不一定每次都使用,选择懒汉式,延迟加载可以节省资源。
- 如果应用对响应速度有要求,且希望在系统启动时就获得实例,则选择饿汉式,它提供了线程安全的同时,也减少了同步处理的开销。
单例模式在高并发环境下的线程安全问题
在高并发环境中,单例模式可能会遇到线程安全问题,尤其是在使用懒汉式实现时。如果多个线程同时调用 getInstance()
方法,并且此时单例实例还未创建,就可能导致多个线程同时执行实例化操作,生成多个实例,违反了单例模式的唯一性原则。
为了解决这一问题,可以使用以下几种线程安全的实现方案:
-
加锁同步(synchronized)
在getInstance()
方法上添加同步锁,确保同一时间只有一个线程可以执行实例化代码。这种方法可以解决线程安全问题,但会降低性能,因为每次调用getInstance()
时都会触发同步操作。<?php class SafeSingleton {private static $instance = null;private function __construct() {}public static function getInstance() {if (self::$instance === null) {// 使用同步锁synchronized(self::class) {if (self::$instance === null) {self::$instance = new SafeSingleton();}}}return self::$instance;} }
-
双重检查锁(Double-Checked Locking)
双重检查锁是一种优化的同步方式。在第一次检查实例是否存在时不加锁,只有在实例不存在的情况下才进入同步代码块。这样可以减少同步锁的使用次数,提高性能。<?php class SafeSingleton {private static $instance = null;private function __construct() {}public static function getInstance() {if (self::$instance === null) {synchronized(self::class) {if (self::$instance === null) {self::$instance = new SafeSingleton();}}}return self::$instance;} }
-
静态初始化(仅适用于支持静态内部类的语言)
在一些支持静态内部类的语言中,可以通过静态内部类的特性实现线程安全的单例模式。静态内部类在被首次调用时才会初始化,具备天然的线程安全性。然而,PHP 不支持静态内部类,因此可以通过其他方式实现懒加载。
在多线程环境下使用单例模式时,需要格外注意线程安全问题。选择合适的同步机制,例如加锁、双重检查锁等,可以确保单例模式的正确性,同时尽量减少性能损耗。这对于确保系统在高并发下的稳定性非常重要。
接下来,我将通过单例模式分别实现 MySQL、Redis、MongoDB 和 Elasticsearch 的连接管理,展示如何在这些场景中应用单例模式。
示例:MySQL 连接管理中的单例模式应用
在大型应用中,数据库连接是一个非常重要的资源。频繁创建和销毁数据库连接不仅会导致资源浪费,还会影响系统性能。通过单例模式来管理 MySQL 连接,我们可以确保应用中只创建一个数据库连接实例,从而提高效率,减少资源消耗。
代码示例
以下是一个 MySQL 连接类的单例模式实现示例:
<?php
class DatabaseConnection {// 用于保存唯一的连接实例private static $instance = null;private $connection;// 私有构造函数,初始化 MySQL 连接private function __construct() {$this->connection = new mysqli("localhost", "username", "password", "database");if ($this->connection->connect_error) {die("数据库连接失败: " . $this->connection->connect_error);}echo "数据库连接已建立\n";}// 获取单例实例的方法public static function getInstance() {if (self::$instance === null) {self::$instance = new DatabaseConnection();}return self::$instance;}// 获取连接public function getConnection() {return $this->connection;}// 防止克隆和反序列化private function __clone() {}private function __wakeup() {}
}// 使用示例
$db1 = DatabaseConnection::getInstance();
$db2 = DatabaseConnection::getInstance();// 验证是否是同一个实例
var_dump($db1 === $db2); // 输出: bool(true)// 获取数据库连接
$connection = $db1->getConnection();
好处
- 节省资源,减少连接开销
通过单例模式,数据库连接只会在首次调用时创建,之后的每次请求都复用同一个连接,避免了频繁创建和关闭连接的开销,极大地提高了系统性能。 - 保证数据一致性
单例模式确保了同一个数据库连接实例在系统的多个模块中共享,使得数据访问的一致性更容易维护,避免了数据不同步的问题。 - 更易于维护和扩展
通过封装数据库连接,其他模块无需关心连接的创建和销毁,只需调用getInstance()
获取连接实例即可。这种结构提高了代码的可读性和可维护性。 - 线程安全
在某些情况下,可以结合锁机制确保单例的线程安全性,避免多线程环境中重复创建连接的问题。
通过这种方式,单例模式不仅优化了 MySQL 连接管理,还提高了代码的可维护性,使得系统更高效稳定。
示例:Redis 连接管理中的单例模式应用
在高并发应用中,Redis 常用于缓存和数据共享。每次创建 Redis 连接都会消耗资源,影响系统性能。因此,通过单例模式管理 Redis 连接,可以有效提高系统的资源利用率和响应速度。
代码示例
以下是一个 Redis 连接类的单例模式实现示例:
<?php
class RedisConnection {// 保存唯一 Redis 连接实例private static $instance = null;private $connection;// 私有构造函数,初始化 Redis 连接private function __construct() {$this->connection = new Redis();$this->connection->connect("127.0.0.1", 6379);echo "Redis 连接已建立\n";}// 获取单例实例的方法public static function getInstance() {if (self::$instance === null) {self::$instance = new RedisConnection();}return self::$instance;}// 获取 Redis 连接public function getConnection() {return $this->connection;}// 防止克隆和反序列化private function __clone() {}private function __wakeup() {}
}// 使用示例
$redis1 = RedisConnection::getInstance();
$redis2 = RedisConnection::getInstance();// 验证是否是同一个实例
var_dump($redis1 === $redis2); // 输出: bool(true)// 获取 Redis 连接
$connection = $redis1->getConnection();
$connection->set("key", "value"); // 设置键值对
echo $connection->get("key"); // 获取键的值,输出: value
好处
- 节省资源,减少连接开销
通过单例模式,Redis 连接只会在首次调用时创建一次,后续的每次请求都复用这个连接。这样避免了重复连接创建和关闭的消耗,显著提高了系统性能,尤其在高并发环境下效果明显。 - 保证数据一致性
单例模式确保多个模块共享同一个 Redis 连接实例,使得对 Redis 的数据读写操作具有一致性,不会因多个连接的不同步而导致数据不一致问题。 - 提高代码可维护性
单例模式将 Redis 连接的管理集中到一个类中,其他模块只需调用getInstance()
即可获取连接实例,无需关心 Redis 连接的初始化和管理,简化了代码结构。 - 线程安全(可扩展)
在多线程环境下,通过增加同步机制,可以确保 Redis 的单例连接在多线程环境下的安全性,防止出现多次实例化的问题。
这种 Redis 单例模式的实现方式,不仅能显著提高系统效率,还可以简化资源管理,使得系统结构更加清晰,资源利用率更高。
示例:MongoDB 连接管理中的单例模式应用
MongoDB 是一种常用的 NoSQL 数据库,单例模式可以确保在应用中只有一个 MongoDB 连接实例,避免重复创建连接的资源浪费。
代码示例
<?php
class MongoDBConnection {// 保存唯一 MongoDB 连接实例private static $instance = null;private $connection;// 私有构造函数,初始化 MongoDB 连接private function __construct() {$this->connection = new MongoDB\Driver\Manager("mongodb://localhost:27017");echo "MongoDB 连接已建立\n";}// 获取单例实例的方法public static function getInstance() {if (self::$instance === null) {self::$instance = new MongoDBConnection();}return self::$instance;}// 获取 MongoDB 连接public function getConnection() {return $this->connection;}// 防止克隆和反序列化private function __clone() {}private function __wakeup() {}
}// 使用示例
$mongo1 = MongoDBConnection::getInstance();
$mongo2 = MongoDBConnection::getInstance();// 验证是否是同一个实例
var_dump($mongo1 === $mongo2); // 输出: bool(true)// 获取 MongoDB 连接
$connection = $mongo1->getConnection();
好处
- 减少连接创建成本:MongoDB 连接建立成本较高,单例模式通过共享一个连接实例,避免了每次请求时都创建新连接,提升了系统效率。
- 提高数据一致性:通过单例模式,可以确保应用中的 MongoDB 操作使用同一个连接实例,保证数据操作的一致性。
- 简化代码管理:其他模块不必关心 MongoDB 连接的创建和管理,简化了代码结构。
示例:Elasticsearch 连接管理中的单例模式应用
Elasticsearch 是一种分布式搜索和分析引擎,适合用于高并发搜索和实时数据分析。通过单例模式管理 Elasticsearch 连接,可以确保系统只创建一个连接实例,提升性能。
代码示例
<?php
class ElasticsearchConnection {// 保存唯一 Elasticsearch 连接实例private static $instance = null;private $client;// 私有构造函数,初始化 Elasticsearch 客户端private function __construct() {$this->client = Elasticsearch\ClientBuilder::create()->setHosts(['localhost:9200'])->build();echo "Elasticsearch 连接已建立\n";}// 获取单例实例的方法public static function getInstance() {if (self::$instance === null) {self::$instance = new ElasticsearchConnection();}return self::$instance;}// 获取 Elasticsearch 客户端public function getClient() {return $this->client;}// 防止克隆和反序列化private function __clone() {}private function __wakeup() {}
}// 使用示例
$es1 = ElasticsearchConnection::getInstance();
$es2 = ElasticsearchConnection::getInstance();// 验证是否是同一个实例
var_dump($es1 === $es2); // 输出: bool(true)// 获取 Elasticsearch 客户端
$client = $es1->getClient();
好处
- 节省系统资源:Elasticsearch 客户端连接建立开销较大,单例模式确保只创建一次连接实例,大幅节省系统资源。
- 减少多次初始化的复杂性:单例模式提供全局访问点,无需在各模块中反复创建新连接,代码更加简洁高效。
- 保证数据一致性:通过同一个连接实例进行所有搜索和写入操作,确保数据查询和存储的一致性。
最后
通过单例模式,我们能够高效地管理 MySQL、Redis、MongoDB 和 Elasticsearch 等资源的连接,实现了资源的合理分配与复用。在这些场景中,单例模式不仅帮助我们避免了重复创建实例带来的性能消耗,还简化了代码结构,提升了系统的稳定性和可维护性。选择单例模式作为这些资源的连接管理方案,可以确保系统在高并发环境下的稳定运行,同时保持数据的一致性和访问的高效性。
相关文章:
php常用设计模式之单例模式
设计模式是我们日常开发中最常用的编程模式之一,也是面试中最高频的考点之一。通过合理运用设计模式,可以使代码结构更加清晰、易于维护。通过这篇文章 我也讲一下设计模式中的单例模式,了解下它的原理和适用场景。 单例模式 单例模式&…...
一文搞懂Android主题和样式
1. 概念与作用 1.1 定义与组成 Android Theme是用于定义应用程序或其部分的视觉和界面风格的一种资源。主题在Android中扮演着重要的角色,它们允许开发者统一和自定义应用的外观和感觉。一个主题定义了一组属性集合,这些属性可以是颜色、字体、控件样式…...

360与重庆科技大学战略携手,为数字中国建设输送实战人才
近日,360数字安全集团与重庆科技大学正式签订了战略合作协议,双方将围绕创新人才培养、科研技术攻关、专业实验室共建、车联网安全以及社会服务等多个维度展开深度合作,共同打造数字安全人才培养新高地,为数字重庆的建设与发展注入…...

基于异常合成的图像异常检测方法
基于异常合成的图像异常检测方法 基于异常合成思路实现图像异常检测的方法,它们的核心思路是: 试图通过合成异常样本穷尽所有可能出现的异常类型,从而将无监督的异常检测(one class classification)建模为一个全监督…...
机器学习方向在算法优化上有哪些创新点?
以下是机器学习算法优化方面的一些创新点: 一、优化算法自身的改进 随机梯度下降(SGD)的变体 Adagrad 传统的随机梯度下降算法使用固定的学习率,而Adagrad根据每个参数的历史梯度信息自适应地调整学习率。对于稀疏数据,它可以为不同的参数分配不同的学习率,使得频繁出现…...

基于yolov8的道路交通事故检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOV8的道路交通事故检测系统是一种先进的智能交通监控解决方案,它利用YOLOV8这一前沿的目标检测算法,实现对交通事故的高效、实时检测。 该系统结合了自定义的道路交通事故数据集,对YOLOV8模型进行了针对性的训练与优化…...
HttpUtils 详解
一、详解 1.1 介绍 现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见! 传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient,不…...

云计算第四阶段: cloud二周目 07-08
cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…...
智能合约开发工具Remix
不久前,我在B站、视频号和 YouTube 都陆续发布了新的一套免费视频课程《智能合约开发工具Remix》,总共分为了 9 个小节的视频,以下分别是这 9 个小节在 B 站的视频链接,喜欢直接看视频的伙伴可以去 B 站观看: 概况文件…...

YYF桌面 1.2 | 个性化桌面体验,清爽美观。
YYF桌面是一款经过定制的安卓桌面启动器,此版本基于1.2版本进行了一系列个性化修改。主界面快捷图标进行了美化处理,并采用了清爽半透明的图标背景。取消了底部快捷键,并重新制作了“全部应用”按钮,保留了动态效果。修改了右上角…...

【人工智能/计算机工程/大数据】第五届人工智能与计算工程国际学术会议(ICAICE 2024,2024年11月8-10日)
The 5th International Conference on Artificial Intelligence and Computer Engineering 第五届人工智能与计算工程国际学术会议(ICAICE 2024) 会议官网:www.event-icaice.org The 5th International Conference on Artificial Intellige…...
uni-app录音功能
纯纯干货,cv即用 <template><!-- 录音页面 --><view class"page"><view class"tape_box"><view class"upload_box1"><view class"upload_top"><view class"upload_img_title…...

C语言【调试】(个人笔记版)
调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记: 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…...

连锁收银系统
商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理,它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…...
5.2024.10.21
2024.10.21 学习和复习 学习QT的流程控制、函数、内联函数复习C语言printf练习 问题及解决方案 C学到函数之后有些吃力代码逻辑能力不大行,需要巩固一下C语言基础再挤多点时间去学习嵌入式写代码前先把大概思路写出来 碎碎念 最近作业比较多,有点静不下…...
前端Socket互动小游戏开发体验分享
随着实时网络通信技术的不断发展,基于WebSocket的前端互动小游戏成为了一种非常流行的选择。WebSocket允许客户端和服务器之间进行双向通信,为游戏互动带来了更快的响应时间和更流畅的体验。本文将通过一个简单的互动小游戏来探讨前端如何利用WebSocket技…...
react项目,通过自定义 separator 属性来修改日期选择器中间的分隔符:
1. 引入必要的依赖 确保你已经引入了 DatePicker 组件和 moment 库。 import React, { Component } from react; import { DatePicker } from antd; import moment from moment; const { RangePicker } DatePicker; const dateFormat "YYYY/MM/DD"; 2. 定义父组…...

双十一有啥好用的家居好物推荐?2024性价比高的超声波清洗机推荐
双十一今天晚上就可以越热开抢了,还不知道购买什么物品的小伙伴们赶紧来看看我这篇文章,在众多家居好物中,超声波清洗机以其高效、便捷的特点,成为了许多家庭的必备神器。2024年,市场上涌现出了不少性价比超高的产品&a…...

比亚迪车机安装第三方应用教程
比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP, 无论是dlink3.0还是4.0都是安卓系统,因此理论上安卓应用是都可以安装的,主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种,直接从电脑端下载安装布…...

移动零---双指针法
目录 一:题目 二:算法原理讲解 三:代码编写 一:题目 题目链接:https://leetcode.cn/problems/move-zeroes/description/ 二:算法原理讲解 三:代码编写 void moveZeroes2(vector<int>& nums) {for (int d…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...