池化技术(对象池)

news2024/11/19 19:27:41

什么是池化技术

池化技术是一种很常见的编程技巧,目的在于提前创建如内存,对象,线程资源,降低程序运行时频繁的创建销毁带来的开销。常见的有线程池,内存池,对象池等。

池化技术如何提高性能,降低系统开销

在实际的应用中,程序经常需要创建对象,线程和分配内存。这些设计到系统调用,系统调用会导致程序从用户态到内核态的切换会比较耗时。有了池化技术,需要用到对应的线程,对象和内存时不需要再切换上下文之需要从相应的池中获取,也不需要销毁,用完归还即可。

线程池实现的原理

先启动若干线程让其处于休眠状态/当用户中的系统需要访问时,从线程池中拿出一个已建立的空闲的连接,使用完毕后不关闭连接而是归还到线程池中。

数据库连接池的重要配置:最大连接数和最小连接数

线程池的重要配置:核心线程数,最大线程数

对象池

写一个对象池需要考虑的:

  • 对象池的结构 ,应该是维护两个固定大小的阻塞队列,两个队列一个是空闲一个使用。从空闲队列中获取对象后放入使用队列。使用完对象后不进行销毁而是放入空闲队列中 .
  • 池的大小 ,池中最大放多少,当池满后怎么解决 .
  • 池子怎么解决并发问题防止对一个对象的竞争

示例
1 对象池接口

public interface HousePool {
    // 创建
    House getHouse();
    // 归还
    void release(House po);
    //初始化
    void init();
}

具体实现

@Service
public class HousePoolImpl implements HousePool{
    // 维护两个池子
    private LinkedBlockingQueue<House> idle ;
    private LinkedBlockingQueue<House> busy ;
    //维护池中的对象数量
    private final  int maxSize = 10 ;
    private AtomicInteger busySize = new AtomicInteger(0) ;

    @Override
    public void init() {
         idle = new LinkedBlockingQueue<>();
         busy = new LinkedBlockingQueue<>();
    }

    @Override
    public House getHouse() {
        // 创建对象池
        House po = null;
        po = idle.poll();
        // 有空闲对象 直接用
        if(po != null){
            busy.offer(po);
            return po;
        }
        // 未满 创建
        if(busySize.get() < maxSize){
            if(busySize.incrementAndGet() <= maxSize){
                System.out.println("创建House");
                po = new House();
                busy.offer(po);
                return po;
            }
        }
        // 已满等待或超时报错
        try {
            idle.poll(10000, TimeUnit.MILLISECONDS);
            if(po ==null){
                   throw  new RuntimeException("超时");
            }
            busy.offer(po);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return po;
    }

    @Override
    public void release(House po) {
        busy.remove(po);
        idle.offer(po);
    }
}

初始化配置

@Configuration
public class PoolConfiguration {

    @Bean
    public  HousePool housePool(){
        HousePoolImpl housePool = new HousePoolImpl();
        housePool.init();
        return housePool;
    }
}

代码解读:
为什么使用LinkedBlockingQueue作为对象池化的容器
1 容量可选:可以选择指定容量,也可以不指定,不指定时容量为Integer.MAX_VALUE。
2 公平性选择:可以选择是否公平地对等待的生产者和消费者进行排序。
3 阻塞操作:当队列为空时,消费者会被阻塞直到队列非空;当队列满时,生产者会被阻塞直到队列有空间。
4 线程安全。

如何解决多线程环境下对同一个空闲对象的竞争

 private AtomicInteger busySize = new AtomicInteger(0) ;
  if(busySize.get() < maxSize){
        if(busySize.incrementAndGet() <= maxSize){
           System.out.println("创建House");
            po = new House();
            busy.offer(po);
            return po;
         }
   }

解决池满后等待问题

// 已满等待或超时报错
        try {
            idle.poll(10000, TimeUnit.MILLISECONDS);
            if(po ==null){
                   throw  new RuntimeException("超时");
            }
            busy.offer(po);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

测试

 @Test
    void testOrigin() {
        housePool.init();
        int i = 0 ;
        while(i < 10){
            House house = housePool.getHouse();
            System.out.println("得到hosue");
            housePool.release(house);
            i++;
        }
    }

结果在这里插入图片描述

可以看到对象只创建了一次,被使用了多次

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

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

相关文章

分享几个电视颜色测试图形卡

介绍 本文分享几个常见的电视颜色测试图形卡和一段matlab程序&#xff0c;完成JPG转FPGA烧写文件&#xff0c;便于把彩色图片预装载到FPGA内。 电视颜色测试图形卡 一种专业检测电视显示效果的工具。它通常由一张卡片和一些色块组成&#xff0c;可以根据标准色彩空间和颜色渐…

A simple two-dimensional Brownian motion animation

This code continues the previous blog post on two-dimensional collisions to model Brownian motion. The code is on GitHub page ‘https://github.com/xnx/collision’. The core classes, PeriodicParticle and PeriodicSimulation are derived from the original Par…

部分c++11特性介绍

在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合并称为C98/03标…

二维码智慧门牌管理系统升级解决方案:存疑地址轻松管理

文章目录 前言一、存疑地址的统一管理二、数据查询、导出和编辑功能三、提交地址审核机制 前言 随着二维码智慧门牌管理系统在企业中的广泛应用&#xff0c;地址存疑成为了一个亟待解决的问题。为了帮助企业有效管理这些存疑地址&#xff0c;我们推出了升级解决方案&#xff0…

网页文章采集工具-人工智能AI功能

简数采集器是一款支持人工智能AI功能的网页文章采集工具&#xff0c;它可以调用百度的文心一言AI对采集的数据进行分析&#xff0c;处理&#xff0c;内容创作等等&#xff0c;根据你的需求进行更加灵活的数据采集和处理。 文心一言人工智能AI功能使用方法&#xff1a; 1. 填写…

2023年中国中高端服饰品牌经营现状和市场发展趋势分析|徐礼昭

徐礼昭&#xff08;商派市场负责人、RRL重构零售实验室负责人&#xff09; 一、引言 中国服饰市场在过去的几年中经历了快速的发展&#xff0c;其中中高端市场更是呈现出强劲的增长势头。然而&#xff0c;随着消费者需求的不断变化和市场竞争的加剧&#xff0c;中高端服饰品牌…

观测云产品更新 | 监控、数据脱敏、快照分享等优化

观测云更新 监控 1、监控器 - 事件内容插入链接的联动优化&#xff1a;根据检测指标自动生成跳转链接&#xff0c;支持在插入链接后调整过滤条件和时间范围&#xff0c;您也可以自定义跳转链接。其中&#xff0c;若需要插入跳转到仪表板的链接&#xff0c;基于以上逻辑&#…

《洛谷深入浅出进阶篇》同余方程+中国剩余定理——洛谷P1495

这篇文章讲介绍&#xff1a;同余方程&#xff0c;中国剩余定理 什么是同余方程&#xff1f; xy &#xff08;mod p&#xff09;这样的&#xff0c;带同余号的式子就是同余方程。 什么是中国剩余定理&#xff1f; 中国剩余定理&#xff0c;顾名思义是出自中国&#xff0c;它…

并查集LRU Cache

目录 前言 一 . 并查集 1.1 并查集原理 1.2 并查集的实现 二 . LRU Cache 2.1 什么是LRU Cache 2.2 LRU Cache实现 2.3 JDK中类似LRUCahe的数据结构LinkedHashMap 2.4 自己实现链表 总结 前言 大家好,今天给大家介绍两种数据结构并查集&LRU Cache 一 . 并查集 1…

Wnmp本地搭建结合内网穿透实现远程访问本地Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&a…

智能优化算法应用:基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.和声算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

分享86个焦点幻灯JS特效,总有一款适合您

分享86个焦点幻灯JS特效&#xff0c;总有一款适合您 86个焦点幻灯JS特效下载链接&#xff1a;https://pan.baidu.com/s/1Gm2jwN_AAF9QjFzQ9bCM_g?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

OWASP SAMM 软件保障成熟度模型

软件保障成熟度模型 我们的使命是为您提供一种有效且可衡量的方式来分析和改进您的安全开发生命周期。 SAMM 支持完整的软件生命周期&#xff0c;并且与技术和流程无关。我们构建的 SAMM 本质上是不断发展和风险驱动的&#xff0c;因为没有一种单一的配方适用于所有组织。奥瓦…

无公网IP环境固定地址远程SSH访问本地树莓派Raspberry Pi

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

「Swift」取消UITableView起始位置在状态栏下方开始

前言&#xff1a;在写页面UI时发现&#xff0c;当隐藏了NavigationBar时&#xff0c;即使UITableView是从(0,0)进行布局&#xff0c;也会一直在手机状态栏下方进行展示布局&#xff0c;而我的想法是希望UITableView可以从状态栏处就进行展示布局 当前页面展示&#xff1a; 问题…

适合学生备考的护眼台灯有哪些?五款公认优质台灯推荐

根据近两年的卫计委数据统计&#xff0c;我国的近视率全球第一。其中小学生平均近视率36%&#xff0c;初中平均近视率71.6%&#xff0c;高中生平均近视率81%。看到这些数据真让作为家长的我们触目惊心。 而这里面&#xff0c;先天的遗传近视并不多&#xff0c;很多的学生近视都…

leecode | 从二叉搜索树到更大和树

官方的题目解释永远晦涩难懂 这就是最大的拦路虎 简单介绍&#xff0c;将二叉搜索树&#xff0c;转换成“更大和树”&#xff0c;“最大的和树”&#xff0c;就是更新节点val&#xff0c;二叉树中所有大于等于该节点的的val 总和&#xff0c;包括本身 #对着图看&#xff0c;会更…

【CANN训练营】ROS2系统及使用介绍

ROS2系统及使用介绍 ROS2介绍及特点介绍 ROS2简介 要说ROS2&#xff0c;那就不得不提起ROS&#xff0c;ROS就是机器人操作系统英文全称(Robot Operating System)&#xff0c;但ROS本身并不是一个操作系统&#xff0c;而是可以安装在现在已有的操作系统上(Linux、Windows、Ma…

自动化测试的4大注意事项

自动化测试能够提高测试效率、覆盖率&#xff0c;降低测试成本和工作量&#xff0c;是软件开发中不可或缺的一部分。但前提是要确保自动化测试的有效性和可靠性&#xff0c;否则无效或错误的自动化测试&#xff0c;往往会对项目造成负面影响&#xff0c;如维护成本高、假阳性和…

面试必会-JAVA基础篇-01

文章目录 1. Final 有什么用&#xff1f;2. 什么是重载&#xff08;Overload&#xff09;和重写&#xff08;Override&#xff09; ?3. 重载的方法能否根据返回类型进行区分&#xff1f;4. 和 equals 的区别是什么5. 什么是反射机制&#xff1f;6. 反射机制优缺点7. 在你进行…