基于享元模式实现连接池

享元模式

结构

享元(Flyweight )模式中存在以下两种状态:

1. 内部状态,即不会随着环境的改变而改变的可共享部分。

2. 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两 种状态,并将外部状态外部化。

享元模式的主要有以下角色:

抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公 共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法 来设置外部数据(外部状态)。

具体享元(Concrete Flyweight)角色 :它实现了抽象享元类,称为享元对象;在具体享元 类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享 元类提供唯一的享元对象。

非享元(Unsharable Flyweight)角色 :并不是所有的抽象享元类的子类都需要被共享,不 能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过 实例化创建。

享元工厂(Flyweight Factory)角色 :负责创建和管理享元角色。当客户对象请求一个享元 对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在 的话,则创建一个新的享元对象。

优缺点

优点:

  • 极大减少内存中相似或相同对象数量,节约系统资源,提供系统性能
  • 享元模式中的外部状态相对独立,且不影响内部状态

缺点:

为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序逻辑复杂

适用场景:

  • 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
  • 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应 当在需要多次重复使用享元对象时才值得使用享元模式。
public class Pool {//1. 连接池大小private final int poolSize;//2. 连接对象数组private Connection[] connections;//3. 连接池状态数组 0空闲 1繁忙 因为要多线程修改,所以要保证线程安全private AtomicIntegerArray states;public Pool(int poolSize){this.poolSize = poolSize;this.connections = new Connection[poolSize];this.states = new AtomicIntegerArray(new int[poolSize]);for (int i = 0; i < poolSize; i++) {//MockConnection 实现于 Connectionconnections[i] = new MockConnection();}}//借连接public Connection borrow(){while(true){for (int i = 0; i < poolSize; i++) {//获取空闲连接if(states.get(i) == 0){if(states.compareAndSet(i,0,1)){System.out.println("borrow:"+connections[i]);return connections[i];}}}// 如果没有空闲连接,当前线程进入等待synchronized (this){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}//归还连接public void free(Connection conn){for(int i = 0;i < poolSize;i++){if(connections[i] == conn){states.set(i,0);synchronized (this){System.out.println("free:"+conn);this.notifyAll();}break;}}}public static void main(String[] args) {Pool pool = new Pool(2);for (int i = 0; i < 5; i++) {new Thread( ()->{Connection conn = pool.borrow();try {Thread.sleep(new Random().nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}pool.free(conn);}).start();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jitpack发布,记录一个异常

异常日志(全文)&#xff1a; Init SDKMan Found Android manifest Android SDK version: . Build tools: Found gradle Gradle build script WARNING: gradle/wrapper/gradle-wrapper.jar does not exist! Needs to be committed.ERROR: Gradle wrapper not found. Please ad…

每日一题:跳跃游戏II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

CAS机制(Compare And Swap)源码解读与三大问题

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的…

西米支付:支付行业中,“清算、结算、清结算”之间的区别

做支付最头疼的三个词莫过于“清算、结算、清结算”&#xff0c; 傻傻分不清&#xff0c;偶尔清晰偶尔混沌&#xff0c;有时候吧觉得自己很清晰了&#xff0c;突然跟别人聊天或者看书、看文章时又觉得糊涂起来了&#xff0c;在一些场景里好像很清晰&#xff0c;但是到了另一些…

构建二叉树搜索树算法题总结(第三十天)

701. 二叉搜索树中的插入操作 题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 答案 cla…

几种免费SSL证书申请方式

目录 DV单域名免费证书的获取渠道&#xff1a; DV多域名免费证书获取渠道&#xff1a; DV通配符免费证书获取渠道&#xff1a; 随着现在网络安全意识的逐渐提升&#xff0c;越来越多的网站都在相继配对部署SSL证书&#xff0c;用以实现https访问。 大家都知道SSL证书好&…

数据分析学习资源(未完)

1、PDF 数据分析自学攻略 增长黑客&#xff08;AARRR&#xff09; 量化思维

异步并发怎么做?

异步并发 1、flask的异步并发问题解决办法实现方案&#xff08;1&#xff09;flask 异步视图装饰器&#xff08;2&#xff09;WSGI启动服务 2、fastapi异步编程 1、flask的异步并发 问题 flask在开发环境下是单线程的&#xff0c;如果某个请求长时间无响应&#xff08;阻塞&…

面试——数据库中的锁升级(Lock Escalation)机制

假设执行下面的sql语句 update tb_user set age age 1;以MySQL为例&#xff0c;按照两阶段锁协议&#xff0c;会先给tb_user加上表意向锁&#xff0c;然后对tb_user的所有行加上行锁&#xff0c;但是当tb_user数据量非常多的时候&#xff0c;频繁的获取行锁会影响性能&#…

idea启动之java.net.BindException: Address already in use: bind

背景&#xff1a; 在win10上安装docker desktop 后&#xff0c;重启电脑&#xff0c;打开idea&#xff0c;提示端口被占用。 一、遇到的问题 打开idea2022.3.3提示以下提示&#xff1a; Internal error. Please refer to https://jb.gg/ide/critical-startup-errorsjava.ne…

C++ | Leetcode C++题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> permuteUnique(vector<int>& nums) {dfs(nums, 0);return res;} private:vector<vector<int>> res;void dfs(vector<int> nums, int x) {if (x num…

冯喜运:【涨久必跌】4.25外汇黄金原油走势分析

【黄金消息面解析】&#xff1a;周三(4月24日)黄金在创下近两年来最大单日跌幅后&#xff0c;持续走低。由于投资者关注缓解中东紧张局势&#xff0c;并有迹象表明美联储将在更长时间内维持较高利率&#xff0c;自2月中旬以来&#xff0c;金价仍上涨约15%&#xff0c;尽管有迹象…

MySQL_day1

目录 [快捷键] # ### part1 # (1) 登录 # (2) 退出 # ### part2 # 查询当前登录用户 # 设置密码 # 去除密码 # ### part3 # 给具体某个ip设置一个账户连接linux # 给具体192.168.126.% 这个网段下的所有ip设置账户 # 给所有ip下的主机设置账户 # ### part4 [必须熟…

CentOS即将停服,国产化系统替代参考

国产化替代CentOS的产品有多个选择&#xff0c;主要包括以下几种&#xff1a; Alibaba Cloud Linux&#xff1a;阿里云提供的Linux操作系统&#xff0c;旨在为用户提供稳定、安全、高性能的云服务器环境。此外&#xff0c;阿里云还发布了“龙蜥”&#xff08;Anolis OS&#x…

软考-系统集成项目管理中级--信息(文档)和配置管理

本章历年考题分值统计(16年11月及以后按新教材考的) 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 本章历年考题及答案解析 12、2018 年下半年第 14题 关于配置管理&#xff0c;不正确的是(14) A、配置管理计划制定时需了解组织结构环境和组织单元之间的联系 B、配置…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

DelphiWebMVC对VUE导出包的支持

MVC框架除了本身对html文件的渲染输出&#xff0c;先开始对Hbuilder或VSCode 开发的VUE项目的导出包&#xff0c;开始支持导出包的部署。 这是一个Hbuilder 的vue 项目&#xff0c;导出包为&#xff1a; 这是一个DelphiWeb项目&#xff0c; 这是DelphiWeb项目的运行目录&#x…

FloodFill算法---DFS

目录 floodfill算法概念&#xff1a; 算法模板套路&#xff1a; 例题1&#xff1a;图像渲染 例题2&#xff1a;岛屿数量 例题3&#xff1a;岛屿的最大面积 例题4&#xff1a;被围绕的区域 floodfill算法概念&#xff1a; floodfill算法是一种常用的图像处理算法&#xf…

Java递归生成树形菜单结构的json

Java递归生成树形菜单结构的json 1.数据class2.获取数据方法3. 组装数据的的递归方法4. 案例5. 结果输出 1.数据class Dept.java public class Dept {/** uuid */private String id;/** 部门名称 */private String name;/** 父id */private String parentId;private List<…

高速AI光模块–通往400G/800G及更高速率

人工智能&#xff08;AI&#xff09;领域对高速数据传输的需求推动了光学技术取得显著进步。本文探讨了实现400G/800G速率的演进历程并展望这些技术在未来能够提供更强大功能。我们深入研究高速400G/800G AI光模块的需求、演变和重要性&#xff0c;展现它们对各个行业的变革性影…