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

news2024/9/20 7:54:52

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

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

相关文章

春意盎然:SpringBoot在线教育平台设计

第五章 系统实现 5.1用户功能模块 用户点击进入到系统操作界面,可以对首页、个人中心、课程信息管理、我的收藏管理、订单管理等功能模块,个人信息:通过列表可以获取账号、密码、姓名、性别、手机、邮箱、照片、备注并进行修改操作&#xff…

网络药理学:15、草稿暂存区(autodock vina)

TCMSP 韦恩图在线网站 https://bioinfogp.cnb.csic.es/tools/venny/index.html String数据库参数详解:https://www.bilibili.com/video/BV1q64y1k7Zf?p16&vd_sourceaed4c634975918b14b7354ec93ce5389 David数据库可以用基因ID或者基因名。 KEGG数据库使用&am…

大雪纷飞的视频素材去哪里找啊?雪景素材库分享

当冬季的银装素裹覆盖大地,无数抖音创作者便开始寻找那些可以捕捉到大雪纷飞的壮观画面。无论是为了制作节日主题的视频、记录下雪天的活动,还是单纯展示雪的清新美,优质的大雪视频素材都显得尤为重要。如果你正为寻找这类素材而苦恼&#xf…

软件测试面试题,精选100 道,内附答案

精挑细选,整理了100道软件测试面试题,都是非常常见的面试题,篇幅较长,所以只放出了题目,答案在评论区! 测试技术面试题 1、什么是兼容性测试?兼容性测试侧重哪些方面? 2、我现在有…

设计模式篇--抽象工厂模式

/*** 主要思路:先构建一个总工厂,包含许多分工厂,再从分工厂中,取出自己想要的类型的物品*/ public class main {public static void main(String[] args) {FactoryProducer factoryProducer new FactoryProducer();//获取手机工…

计算机网络(六) —— http协议详解

目录 一,预备知识 1.1 关于域名 1.2 关于URL 1.3 urlencode和urldecode 二,关于http 2.1 什么是http 2.2 http协议格式 2.2.1 网络协议栈 2.2.2 http请求协议格式* 2.2.3 http响应协议格式* 三,http细节字段 3.1 http方法 3.2 …

《A++ 敏捷开发》- 26 根与翼

中国社会一直非常强调家庭价值观,希望实现家族的持续传承,家族有族谱,代代相传的关系对每个家庭成员的成长产生深远影响。我们每个人都只是人类进化过程中的短暂过渡。父母普遍希望把最好的东西传承给下一代。然而我们需要问自己,…

【Go】Go语言中延迟函数、函数数据的类型、匿名函数、闭包等高阶函数用法与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

每日处理250亿个事件,Canva如何应对数据洪流

在这个数据被称为“新石油”的时代,如何有效地处理海量信息流显得尤为重要。作为广受欢迎的设计平台,Canva不仅因其用户友好的界面而备受关注,还因其高效利用Amazon Kinesis管理每日高达250亿个事件而成为热议焦点。让我们深入探讨Canva是如何…

【案例70】invalid secrity token(null)

问题现象 系统登录时提示invalid secrity token(null) 问题分析 排查发现令牌种子没有配置或被人为修改 解决方案 1、登录环境。代码路径下bin下有个sysconfig.bat。左侧选“系统配置”。右侧点“安全”。读取保存一下。 2、或者找一个好用的环境。把ierp/bin下的prop.xml文…

Redis简介、常用命令及优化

文章目录 一、关系数据库​​与非关系型数据库概述1. 关系型数据库2. 非关系型数据库3.关系数据库与非关系型数据库区别 二、Redis简介1.Redis的单线程模式2.Redis 优点3.Redis 缺点 三、安装redis四、Redis 命令工具五、Redis 数据库常用命令六、Redis 多数据库常用命令七、Re…

【算法专题--回文】最长回文子串 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、预备知识 🥝 什么回文串 ? 四、题目解析 五、总结与提炼 六、共勉 一、前言 最长回文子串 这道题,可以说是--回文专题 --,最经典的一道题,也是在面试中频率最高…

哈希表和双向链表实现LRU

LRU(Least Recently Used)即最近最少使用,是一种内存管理算法。最近在Linux的缓冲区管理也看到了使用LRU算法,即利用哈希表进行 O(1) 复杂度的快速查找,利用双向链表(里面的元素是缓冲头)对缓冲…

再次进阶 舞台王者 第八季完美童模全球赛代言人【吴浩美】赛场+秀场超燃合集

7月20-23日,2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上,一位才能出众的少女——吴浩美迎来了她舞台生涯的璀璨时刻。 代言人——吴浩美,以璀璨童星之姿,优雅地踏上完美童模盛宴的绚丽舞台,作为开…

【趣学Python算法100例】兔子产子

问题描述 有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总对数为多少? 题目解析 兔子产子问题是一个有趣的古典数学问题&#xff0c…

Office关闭安全提示

每次启动都要提示这个,怎么关?

大数据-135 - ClickHouse 集群 - 数据类型 实际测试

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数

title: Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数 date: 2024/9/14 updated: 2024/9/14 author: cmdragon excerpt: 通过使用 Nuxt Kit 的自动导入功能,您可以更高效地管理和使用公共函数、组合式函数和 Vue API。无论是单个导入、目录导入还是从第三方模块导入…

GMB外链是什么?

GMB外链其实就是百万外链,它是一种通过大量反向链接来提升网站页面权重的方法。如果你刚建了一个新网站,想在短时间内被收录并获得排名,GMB外链能帮你做到这点。它不像传统SEO那样需要等待好几个月的效果,GMB外链能在24小时内帮你…

vector(2)

前言 通过上一节的学习,我们知道了vector中可以存放各种类型的数据,这就意味着vector之中不仅仅可以存放int、char等内置类型,还可以存放vector和string等类型,我们结合底层的具体情况来具体分析 vector的复用(套娃&a…