《程序猿之设计模式实战 · 池化思想》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 技术简介
    • 常见运用
      • JDK 线程池
      • Tomcat 线程池
      • Druid 连接池
      • 字符串常量池
      • 归纳一下
    • 分析拓展
      • JDK 线程池
      • Tomcat 线程池
    • 总结陈词

写在前面的话

严格来说,池化思想不属于23种设计模式,但也属于日常编码中,关于设计思路和解决方案的一种。

由于近期接触比较多,就顺带分享交流一下。

本系列文章:

《程序猿之设计模式实战 · 策略模式》
《程序猿之设计模式实战 · 装饰者模式》


技术简介

池化思想是一种资源管理的设计模式,旨在通过重用已创建的对象来减少资源的消耗和提高性能。通过维护一个对象池,系统可以避免频繁地创建和销毁对象,从而降低开销和提高响应速度。

核心目的归纳为四个字:资源复用。

常见运用

程序猿在日常开发中,应该都接触过 JDK 线程池、Tomcat 线程池、Druid 连接池,这些都可以被视为“池”的实现。

下面分别介绍。

JDK 线程池

JDK 提供的线程池(如 Executors 类)可以管理线程的创建和复用。

通过配置核心线程数、最大线程数、线程存活时间等参数,可以灵活控制线程的使用。

提供了多种类型的线程池,如固定大小线程池、缓存线程池、单线程池等。

适合处理大量短时间的任务,避免频繁创建和销毁线程的开销。

Tomcat 线程池

Tomcat 作为一个 Servlet 容器,使用线程池来处理请求。

线程池的配置可以在 server.xml 中进行,允许设置最大线程数、最大连接数等。

通过重用线程,Tomcat 可以高效地处理并发请求,减少延迟。

适合高并发的 Web 应用,能够有效管理请求的处理。

Druid 连接池

Druid 是一个高性能的数据库连接池,提供了连接的复用和管理。

支持监控、统计、扩展等功能,方便开发者进行性能调优。

提供了连接的有效性检查,确保连接的可用性。

适合需要频繁访问数据库的应用,能够显著提高数据库操作的效率。

字符串常量池

字符串常量池是 Java 中的一种特殊机制,用于存储字符串字面量。

当创建字符串字面量时,JVM 会首先检查常量池中是否已有相同的字符串,如果有,则直接返回该引用。

通过重用字符串对象,节省内存空间,提高性能。

适合存储大量重复的字符串,避免了重复创建相同字符串的开销。

归纳一下

上述提到的 JDK 线程池、Tomcat 线程池、Druid 连接池和字符串常量池都可以被视为“池”的实现,尽管它们的具体用途和实现方式有所不同。

  • JDK 线程池:管理和复用线程,处理并发任务,减少线程创建和销毁的开销。
  • Tomcat 线程池:用于处理 HTTP 请求,管理服务器的工作线程,提升 Web 应用的并发处理能力。
  • Druid 连接池:管理数据库连接的创建和复用,减少连接建立的开销,提高数据库操作的效率。
  • String 常量池:存储字符串字面量,避免重复创建相同字符串,节省内存。

这些都属于池化思想的应用,通过复用资源来提高性能和效率,虽然它们的具体实现和应用场景不同,但核心理念是一致的。


分析拓展

JDK 线程池

这里以JDK线程池为例,详细介绍一下,帮助理解池化思想。

详细可参考:《知识点扫盲 · 线程池基础篇》

主要先看看下方的线程池运行流程:

里面的每个判断节点和箭头指向,就体现了关于池化思想的设计。

所谓JDK线程池,就是存储了很多线程(Thread),要复用的资源也就是Thread。

线程池从编码上,利用几个核心参数,例如核心线程数、最大线程数、缓存队列、拒绝策略等,控制了线程资源的复用规律。

1、核心线程,持续活跃的线程,最直接用来复用的单位;

2、缓存队列,按需使用不同队列,针对来不及处理的任务做缓冲处理,让活跃线程的任务处理有规律可循;

3、最大线程,相当于一级兜底方案,当队列满的时候,可以增补资源,又不至于失控;

4、拒绝策略,相当于二级兜底方案,针对实际场景,选择最后的解决方案;

Tips:关于线程池的更深入讲解,下一篇专题展开,这边主要体现一个池化思想。

Tomcat 线程池

无独有偶,Tomcat 线程池又是怎么做到池化的?

其实,Tomcat 线程池的核心流程和 JDK 线程池差不多,围绕下面四个 Tomcat 参数:

1、也有核心线程、最大线程、队列等概念,拒绝策略是固定的;

2、超过核心线程数2的时候,是先会创建到最大线程,再超过才放入队列,这个和JDK线程池有一些区别;

3、队列是无限队列,但达到maxConnections的10个后,继续请求就进不来了;

4、acceptCount相当于在3的基础上,操作系统允许再接收5个请求,处于类似挂起状态;

5、再超过5个的话,该请求会提示在一定时常后超时;

Tips:对比JDK线程池,流程上还是有一些区别的。


总结陈词

可以看出来,虽然流程上稍有区别,但本质思路还是一致的,Druid 连接池的实现思路也大同小异。

我们如果自己要实现一个的话,主要学习的是这种复用的思想,至于编码细节是可以按自己的设计调整的。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

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

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

相关文章

“xi” 和 “dbscan” 在OPTICS聚类中是什么意思

在 OPTICS(Ordering Points To Identify the Clustering Structure) 聚类算法中,xi 和 dbscan 是两种不同的聚类提取方法,它们用于从OPTICS算法生成的排序数据中提取最终的聚类结构。具体解释如下: dbscan 方法: 该方法…

LSS如何做深度和语义预测

get_cam_feats() 先来看看代码: def get_cam_feats(self, x):"""Return B x N x D x H/downsample x W/downsample x C"""B, N

PHP函数如何传递数组参数

php 函数可以使用数组参数传递大量数据。语法:参数类型前加上方括号 ([])。例如:myfunction(array $arr)。实战案例:计算数组元素平均值。注意:数组参数默认为引用传递,类型提示可提高代码可读性,数组解构可…

解锁编程潜力,从掌握GitHub开始

目录: 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1)in关键词 2)star或fork数量去查找 3)awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

OpenSSL工具验证RSA证书

openssl x509 是一个用于处理 X.509 证书的命令行工具。常用的 openssl x509 命令&#xff1a; -in <file>&#xff1a;指定输入文件。-out <file>&#xff1a;指定输出文件。-noout&#xff1a;不输出证书信息。-text&#xff1a;以文本格式输出证书信息。-pubke…

基于SSM的大学新生报到系统+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

关于RabbitMQ消息丢失的解决方案

RabbitMQ如何保证消息的可靠性传输 一、消息丢失的原因 1. 生产者端 网络问题&#xff1a; 原因&#xff1a;生产者与RabbitMQ服务器之间的网络连接不稳定或中断&#xff0c;导致消息在传输过程中丢失。解决方案&#xff1a;确保网络连接稳定&#xff0c;监控网络状态&#x…

springboot后端开发-常见注解及其用途

文章目录 1. 组件注解2. 依赖注入注解3. 配置类注解4. 测试注解5. 控制器注解6. 安全和认证注解7. 切面相关注解8. API文档相关注解(需引入swagger)9. 其他注解 在Spring Boot框架中&#xff0c;有许多常用的注解用来简化开发过程中的依赖注入、组件扫描、配置、安全控制等方面…

VSCode创建C++项目和编译多文件

前言 在刚安装好VSCode后&#xff0c;我简单尝试了仅main.cpp单文件编译代码&#xff0c;没有问题&#xff0c;但是当我尝试多文件编译时&#xff0c;就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”&#xff1b;在菜单中选择“打开文件夹”&#xff1b;在…

软件测试工程师面试整理-数据库与SQL

在软件测试过程中,数据库和SQL的知识是非常重要的,尤其是在涉及数据密集型应用或需要验证数据准确性的场景中。测试人员需要掌握SQL语句,以便查询、插入、更新和删除数据,并验证数据库操作的正确性。 1. 数据库基础知识 ● 关系型数据库:大多数应用使用关系型数据库(如My…

Qt什么时候触发paintEvent事件

‌paintEvent事件可以在以下几种情况下被触发‌&#xff1a; ‌窗口初始化和显示‌&#xff1a;当窗口首次被创建、显示&#xff0c;或者窗口被覆盖、最小化后再恢复时&#xff0c;paintEvent会被触发以绘制窗口的内容。‌部件大小或位置变化‌&#xff1a;如果窗口或部件的大…

【Elasticsearch系列二】安装 Kibana

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ClickHouse 24.8 LTS 版本发布说明

本文字数&#xff1a;13885&#xff1b;估计阅读时间&#xff1a;35 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 时间飞逝&#xff0c;又到了新版本发布的时刻&#xff01; 发布概要 本次ClickHouse 24.8 版本包含了19个新功能&#x1f381;、18…

基于51单片机的16X16点阵显示屏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1JQ225NSKweqf1Zlad_f1Mw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

管家婆云辉煌手机端怎么连接蓝牙打印机?

管家婆云辉煌手机端可以连接蓝牙打印机&#xff0c;这样手机可以发送打印任务到蓝牙打印机&#xff0c;完成打印任务。具体的设置步骤如下&#xff1a; 一、首先完成手机和蓝牙打印机配对&#xff0c;打开蓝牙打印机后。手机开启蓝牙和定位服务 点击手机设置&#xff0c;进入手…

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM 文章目录 一、基本原理DE-SVM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 DE-SVM 分类预测原理和流程 1. 差分进化优化算法&#xff08;DE&#xff09; 原理…

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONN…

走进低代码表单开发(一):可视化表单数据源设计

在前文&#xff0c;我们已对勤研低代码平台的报表功能做了详细介绍。接下来&#xff0c;让我们深入探究低代码开发中最为常用的表单设计功能。一个完整的应用是由众多表单组合而成的&#xff0c;所以高效的表单设计在开发过程中起着至关重要的作用。让我们一同了解勤研低代码开…

设计模式---中介者模式

设计模式---中介者模式 定义与设计思路中介者模式的引入&#xff1a;机场控制塔中介者模式的设计框架 定义与设计思路 定义&#xff1a;用一个中介对象来封装一系列对象交互。中介者使各对象不需要相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间…