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

📢 大家好,我是 【战神刘玉栋】,有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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

【Elasticsearch系列二】安装 Kibana

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

ClickHouse 24.8 LTS 版本发布说明

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

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

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

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

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

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

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

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

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

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

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

[网络]http/https的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

FPGA实现串口升级及MultiBoot(四)MultiBoot简介

缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7 我们在正常升级的过程(只使用一个位流文件),假如:(1)因为干扰通信模块收到了一个错误位;(2)或者烧写进FLASH时…

《深度学习》—— 神经网络模型中的损失函数及正则化惩罚和梯度下降

文章目录 前言一、损失函数二、正则化惩罚三、梯度下降 前言 在神经网络中,损失函数、正则化惩罚和梯度下降是三个关键的概念,它们共同作用于网络的训练过程,以提升网络的性能和泛化能力。神经网络模型结构如下图所示: 在构建好一…

LCSS—最长回文子序列

思路分析 关于”回文串“的问题,是面试中常见的,本文提升难度,讲一讲”最长回文子序列“问题,题目很好理解: 输入一个字符串 s,请找出 s 中的最长回文子序列长度。 比如输入 s"aecda"&#xff0c…

【AI-18】Adam和SGD优化算法比较

Adam(Adaptive Moment Estimation)和 SGD(Stochastic Gradient Descent,随机梯度下降)是两种常见的优化算法,它们在不同方面有各自的特点。 一、算法原理 SGD: 通过计算损失函数关于每个样本的…

S7-1500T分布式同步功能

1. 功能描述工控人加入PLC工业自动化精英社群 在一些实际应用中,会需要很多轴进行同步运行,如印刷机、纸尿裤生产线等。由于一个 PLC 的运动控制资源有限,控制轴的数量也是有限的,就会需要多个 PLC 间协调实现轴工艺对象的跨CPU的…

k8s以及prometheus

#生成控制器文件并建立控制器 [rootk8s-master ~]# kubectl create deployment bwmis --image timinglee/myapp:v1 --replicas 2 --dry-runclient -o yaml > bwmis.yaml [rootk8s-master ~]# kubectl expose deployment bwmis --port 80 --target-port 80 --dry-runclient…

专题三_二分查找算法_算法详细总结

目录 二分查找 1.⼆分查找(easy) 1)朴素二分查找,就是设mid(leftright)/2,xnums[mid],t就是我们要找的值 2)二分查找就是要求保证数组有序的前提下才能进行。 3)细节问题: 总结&#xff1a…