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

devtools/2024/11/15 6:16:11/

📢 大家好,我是 【战神刘玉栋】,有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.ppmy.cn/devtools/114285.html

相关文章

【题解】CF2009G1

前言 只会做G1 ,但尽量做到最好,除了一开始的排序的O(nlogn),后续处理都是O(n)。可能会对G2和G3有一点点用处。 翻译 原题链接CF2009G1 思路 直接处理等差数列不方便,但这个等差数列性质特殊,即公差为1。所以在一个等差数列…

干货:分享6款ai论文写作助手,一键生成原创论文(步骤+工具)

写一篇论文是一个复杂的过程,涉及多个步骤,包括选题、研究、撰写、编辑和校对。AI可以在其中的一些步骤中提供帮助,但最终的论文还是需要人类作者的深入思考和创造性输入。以下是六款值得推荐的AI论文写作助手,其中特别推荐千笔-A…

一个有个性的使用工具thefuck@Ubuntu

这个工具名字可能有些粗鄙,不过真的有让人眼前一亮的功能。 当用户输入错误的命令时,TheFuck会根据上下文自动推测并给出正确的命令建议。 安装 apt update apt search thefuck apt install thefuck 使用 在错误命令下面直接输入thefuck即可。 不过…

springboot通过tomcat部署项目(包含jar、war两种方式,迄今为止全网最详细!2024更新..建议收藏,教学!万字长文!)

本博客参考的所有文章均已在结尾声明!!! 在 Spring Boot 项目中,有两种常见的部署方式: 1、使用 Spring Boot 自带的 内置 Tomcat,将项目打包为 jar 并直接运行。 2、使用 外置 Tomcat,将项目打…

【算法专题】穷举vs暴搜vs深搜vs回溯vs剪枝

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣(LeetCode) 本题要求我们将全部为0的二叉树去掉,也就是剪枝,当我们举一个具体的例子进行模拟时,会发现,只关注于对其中一个子树的根节点进行剪枝,由于我…

Ubuntu 22.04上安装Python 3.10.x

在Ubuntu 22.04上安装Python 3.10.x可以通过以下步骤完成: 前言 本文由浪浪云赞助发布,我们特别感谢浪浪云的鼎力支持。浪浪云作为业界领先的云服务提供商,以其卓越的性能和可靠性,助力全球众多企业和开发者实现了业务的快速部署…

全网多少没买过的朋友!央视热播剧《凡人歌》大结局:我们一生,最该看透的7条生活真相——早读(逆天打工人爬取热门微信文章解读)

你买过吗? 引言Python 代码第一篇 洞见 央视热播剧《凡人歌》大结局:我们一生,最该看透的7条生活真相第二篇 市场很差 人很可怜结尾 绝了 这些我都没有买过 引言 时隔多日 又来啦 五天了 中秋假期真的很长呀 我多休了两天 美滋滋 但是别嫉妒…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为: 接下来我们将对其中较重要的部分进行介绍。 4位版本:这里的四位版本只有两个取值 分别为IPv4和IPv6,这两个额分别为不同的IP协议,但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…