设计模式——对象池模式
对象池模式
- 1. 概述
- 2. 适用场景
- 3. 原理
- 4. 优点
- 5. 缺点
- 示例代码
- 示例代码
- 使用示例
- Java 标准库中的例子
- Apache Commons Pool 示例
1. 概述
对象池模式(Object Pool Pattern) 是一种用于管理和复用一组预先创建的对象的设计模式。它的主要目的是为了提高性能和节省资源。当创建对象成本较高,而对象使用频率不高时,对象池可以有效地减少创建和销毁对象的次数,从而提高性能。
2. 适用场景
- 数据库连接管理:数据库连接的建立和断开是昂贵的操作。
- 图形处理中的对象复用:在图形处理中,创建和销毁图形对象也是耗时的操作。
- 线程管理:创建新线程同样代价高昂,因此可以使用线程池来管理线程。
3. 原理
对象池模式的核心思想是在系统初始化期间创建一定数量的对象,并将它们保存在一个池中。当需要使用这些对象时,从池中获取;当用完后,不是立即销毁对象,而是将其归还给池,以便后续使用。
4. 优点
- 减少创建和销毁对象的成本:通过重复使用已有的对象,减少了创建新对象所需的资源消耗。
- 提高响应速度:对象已经准备好使用,无需等待构造函数的执行。
5. 缺点
- 增加了系统的复杂性:引入对象池会增加系统的复杂性,需要管理对象的创建、回收等。
- 对象状态管理:需要确保对象在被重新使用之前处于正确的状态。
示例代码
接下来是一个简单的对象池模式实现示例,创建一个线程安全的对象池来管理Connection对象。
示例代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class ConnectionPool {private BlockingQueue<Connection> pool;private final int maxConnections;public ConnectionPool(int maxConnections) {this.maxConnections = maxConnections;pool = new LinkedBlockingQueue<>(maxConnections);initializePool(maxConnections);}private void initializePool(int maxConnections) {try {for (int i = 0; i < maxConnections; i++) {Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","root", "password");pool.put(conn);}} catch (InterruptedException | SQLException e) {e.printStackTrace();}}public Connection getConnection() throws InterruptedException {return pool.take();}public void releaseConnection(Connection connection) {if (connection != null) {try {pool.put(connection);} catch (InterruptedException e) {e.printStackTrace();}}}
}
使用示例
public class Main {public static void main(String[] args) {ConnectionPool pool = new ConnectionPool(10);// 获取连接try (Connection conn = pool.getConnection()) {// 使用连接...} catch (InterruptedException e) {e.printStackTrace();} finally {pool.releaseConnection(conn);}}
}
Java 标准库中的例子
Java 标准库中有一些类和接口可以用来实现类似的功能,例如 java.util.concurrent 包中的 BlockingQueue 接口,它可以用来作为对象池的底层数据结构。此外,Apache Commons Pool库提供了一种通用的对象池实现,可以用于多种类型的对象。
Apache Commons Pool 示例
下面是一个使用Commons Pool实现的简单示例:
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class SimpleObjectPool<T> extends GenericObjectPool<T> {public SimpleObjectPool(BasePooledObjectFactory<T> factory) {super(factory);}
}class SimpleObjectFactory<T> extends BasePooledObjectFactory<T> {@Overridepublic T create() throws Exception {// 创建对象逻辑return null;}@Overridepublic PooledObject<T> wrap(T obj) {return new DefaultPooledObject<>(obj);}
}// 使用示例
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
SimpleObjectPool<MyObject> pool = new SimpleObjectPool<>(new SimpleObjectFactory<>(), config);
这个示例展示了如何使用Commons Pool创建一个泛型对象池,并提供了创建和包装对象的基本方法。
相关文章:
设计模式——对象池模式
对象池模式 1. 概述2. 适用场景3. 原理4. 优点5. 缺点 示例代码示例代码使用示例 Java 标准库中的例子Apache Commons Pool 示例 1. 概述 对象池模式(Object Pool Pattern) 是一种用于管理和复用一组预先创建的对象的设计模式。它的主要目的是为了提高性…...
【VitualBox】VitualBox的网络模式+网络配置
VirtualBox 1. 简介 VirtualBox 是一款开源虚拟机软件,使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。 2. 六种网络接入模式 VirtualBox提供了多种网络接入模式,他们各有优缺点…...
「Netmarble 小镇」活动来了:踏上穿越标志性世界的旅程!
欢迎来到 Netmarble 小镇!本次活动从 9 月 13 日持续到 10 月 11 日,是你们体验 Netmarble 著名游戏世界最精彩内容的入口。在为期一个月的庆祝活动中,你们将体验到独家内容、惊险刺激的挑战和全新人物化身的发布! 探索 Netmarble…...
MySQL 中的索引覆盖扫描:加速查询的秘密武器
在 MySQL 数据库的使用中,索引是提高查询性能的重要工具。而索引覆盖扫描(Index Covering Scan)更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…...
【机器学习】经典数据集鸢尾花的分类识别
【机器学习】经典数据集鸢尾花的分类识别 1、数据集介绍1.1 数据集详情 2、实验内容2.1 准备数据集2.2 创建颜色映射对象2.3 绘制特征散点图2.4 数据的归一化2.5 数据的标准化 3、实验截图提取萼片长度与萼片宽度分类提取萼片长度与花瓣长度分类提取萼片长度与花瓣宽度分类提取…...
Oracle从入门到放弃
Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…...
学习笔记 - 知识图谱的符号表示方法
学习笔记 - 知识图谱的符号表示方法 说明: 首次发表日期:2024-09-13个人阅读学习并摘录成笔记 知识表示的相关名词定义 以下内容摘录自 Knowledge Graphs Applied 2.3小节,然后AI翻译人工润色。 实体(Entities)—表…...
探索RESTful风格的网络请求:构建高效、可维护的API接口【后端 20】
探索RESTful风格的网络请求:构建高效、可维护的API接口 在当今的软件开发领域,RESTful(Representational State Transfer)风格的网络请求已经成为构建Web服务和API接口的标配。RESTful风格以其简洁、无状态、可缓存以及分层系统等…...
【深度智能】:迈向高级时代的人工智能全景指南
前几天偶然发现了一个超棒的人工智能学习网站,内容通俗易懂,讲解风趣幽默,简直让人欲罢不能。忍不住分享给大家,人工智能立刻跳转,开启你的AI学习之旅吧! 第一阶段:基础知识 1. 计算机科…...
unity3d入门教程七
unity3d入门教程七 17.1物理系统17.2静态刚体17.3刚体的碰撞17.4刚体的反弹18.1运动学刚体18.2碰撞检测18.3碰撞事件回调18.4目标的识别18.5碰撞的规避 17.1物理系统 在物理系统中的物体具有质量和速度的是刚体 不用写代码就会自由落体运动了 17.2静态刚体 给 ‘地面’ 添…...
python植物大战僵尸项目源码【免费】
植物大战僵尸是一款经典的塔防游戏,玩家通过种植各种植物来抵御僵尸的进攻。 源码下载地址: 植物大战僵尸项目源码 提取码: 8muq...
目前人工智能时代,程序员如何保持核心竞争力?
随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作,也有人认为AI是提高效率的得力助手。面对这一趋势,…...
golang学习笔记20——golang微服务负载均衡的问题与解决方案
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
基于微信小程序的健身房管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的健…...
【裸机装机系列】6.kali(ubuntu)-图形界面优化-让linux更适合你的使用习惯
接下来就是图形化界面操作的部分了。会用少量截图来说明,图太多会影响阅读体验,直接文字来描述过程吧。 1> 入口 任务栏左上角——> 开始菜单——> settings——> settings manager 大部分配置都会在这里面设置。 2> 设置里面分的4大…...
新的突破,如何让AI与人类对话变得“顺滑”:Moshi背后的黑科技
你有没有想过,当我们跟智能音箱、客服机器人或者语音助手对话时,它们是怎么“听懂”我们说的话,又是怎么迅速给出回应的?就好像你对着Siri、Alexa说一句:“给我订个披萨”,它立刻明白你想要干嘛,然后帮你下单。背后的技术其实比我们想象的要复杂得多,但现在,有了Moshi…...
torch.embedding 报错 IndexError: index out of range in self
文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错: IndexError: index out of range in self2. 原因 首先看下正常情况: import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…...
rocky9虚拟机配置双网卡的详细过程
编辑虚拟机配置->添加->选择网络适配器->确认->打开虚拟机 1.ip add查看第二个网卡的名称,我这里是ens36 2.cd到网卡的配置文件目录 cd /etc/NetworkManager/system-connections/ ls3.复制一份网卡的配置文件并改名为ens36.nmconnection(根据自己的第…...
索引的介绍
目录 1.索引的介绍 1.1 什么是索引 1.2 为什么要使用索引 2.索引应该选择哪种数据结构 3.MYSQL中的页 3.1为什么要使用页 3.2页文件头和页文件尾 3.3 页主体 3.3页目录 3.4数据页头 4.B在MYSQL索引中的应用 4.1计算三层树高的B树可以存放多少条记录 5.索引分类 5.1 主…...
Web后端服务平台解析漏洞与修复、文件包含漏洞详解
免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《中华人民共和国网络安全法》及其所在国…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
