【设计模式系列】享元模式(十五)

目录

一、什么是享元模式

二、享元模式的角色

三、享元模式的典型应用场景

四、享元模式在ThreadPoolExecutor中的应用

1. 享元对象(Flyweight)- 工作线程(Worker)

2. 享元工厂(Flyweight Factory)- ThreadPoolExecutor

3. 外部状态(Extrinsic State)- 任务(Runnable)

4. 上下文(Context)- 任务执行的环境


一、什么是享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,其核心思想是使用共享的方式来高效地管理大量细粒度的对象。享元模式的主要目的是减少内存消耗,通过共享对象来减少创建对象的数量。这种模式特别适用于系统中存在大量相似或相同的对象时,通过共享这些对象可以减少内存占用和提高性能。

二、享元模式的角色

  1. 享元对象(Flyweight):享元对象是享元模式的核心,它代表了可以被共享的最小单位。享元对象包含内部状态(intrinsic state),这些状态是不变的,并且通常在享元对象创建时就确定下来。享元对象不存储外部状态(extrinsic state),外部状态通常由客户端在需要时提供。

  2. 享元工厂(Flyweight Factory):享元工厂负责创建和管理享元对象。它确保享元对象被适当地共享,并且当需要享元对象时,工厂会提供一个现有的实例或创建一个新的实例。享元工厂还负责管理享元对象的生命周期,包括对象的创建、存储和销毁。

  3. 上下文(Context)(可选):上下文角色不是享元模式的标准部分,但在某些实现中可能会出现。上下文角色负责将享元对象与外部状态结合起来,以便在享元对象执行操作时提供完整的环境。这有助于隐藏享元对象和外部状态之间的耦合,使得享元对象可以专注于其内部状态和行为。

三、享元模式的典型应用场景

  1. 线程池:线程池中的线程对象可以被视为享元对象,被多个任务共享使用,从而避免了频繁创建和销毁线程的开销。

  2. 数据库连接池:数据库连接是一种资源,通过使用享元模式,可以共享已经创建的数据库连接对象,避免频繁创建和销毁数据库连接,提高数据库访问效率。

  3. 对象池:对象池是一种特殊的缓存系统,用于管理对象的生命周期。通过使用对象池技术,可以预先创建一定数量的对象,并在需要时将它们分配出去,使用完毕后再将它们回收回来重新利用。这样可以避免频繁地创建和销毁对象,从而提高系统性能。

  4. 字符串池:Java中的字符串常量池就是使用享元模式的典型示例。当多个字符串具有相同的值时,它们可以共享同一个字符串对象,从而节省了内存空间。

四、享元模式在ThreadPoolExecutor中的应用

1. 享元对象(Flyweight)- 工作线程(Worker)

ThreadPoolExecutor中,享元对象是工作线程。每个工作线程可以执行多个任务,任务完成后,线程不会销毁,而是返回线程池中等待执行下一个任务。

final class Worker extends AbstractQueuedSynchronizer implements Runnable {// 省略其他代码...
}

Worker类是ThreadPoolExecutor中的核心,它继承自AbstractQueuedSynchronizer并实现了Runnable接口。每个Worker对象代表一个线程,可以反复执行多个任务。

2. 享元工厂(Flyweight Factory)- ThreadPoolExecutor

ThreadPoolExecutor本身充当享元工厂的角色,负责创建和维护工作线程(享元对象)。

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {// 省略其他代码...
}

构造函数初始化线程池的基本属性,如核心线程数、最大线程数、工作队列等。

3. 外部状态(Extrinsic State)- 任务(Runnable)

ThreadPoolExecutor中,外部状态是提交给线程池执行的任务。每个任务都是独立的,工作线程(享元对象)执行这些任务时会使用它们。

executor.execute(new Runnable() {public void run() {// 任务代码}
});

4. 上下文(Context)- 任务执行的环境

ThreadPoolExecutor的上下文中,上下文可以被视为Worker对象本身。Worker对象不仅包含了线程(Thread),还包含了要执行的任务(firstTask)。当Worker对象执行任务时,它实际上就是在提供执行环境,即上下文。Worker对象从任务队列中获取任务并执行,这个过程中Worker对象就是享元对象与外部状态(任务)之间的桥梁。

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

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

相关文章

为什么分布式光伏规模是6MW为界点

安科瑞 华楠 近日&#xff0c;能源局发布定义分布式光伏6MW及以上的光伏电站必须自发自用&#xff0c;自行消纳。多省能源局规定大于6MW的电站必须按集中式管理&#xff0c;另外大于6MW&#xff08;包含&#xff09;要省级审批&#xff0c;小于则由市级审批&#xff0c;10kV线…

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

如何利用 CAS 实现原子操作:深入浅出原子类与线程安全

在并发编程中&#xff0c;确保线程安全是一个重要话题。为了避免多个线程对同一数据进行竞争访问&#xff0c;Java 提供了原子类&#xff08;Atomic Classes&#xff09;来保证并发场景下的线程安全&#xff0c;而原子类最核心的实现机制就是 CAS&#xff08;Compare And Swap&…

四万字长文SpringBoot、Spring、SpringMVC等相关面试题(注:该篇博客将会持续维护 最新维护时间:2024年11月12日)

&#x1f9f8;本篇博客重在讲解SpringBoot、Spring、SpringMVC等相关面试题&#xff0c;将会实时更新&#xff0c;欢迎大家添加作者文末联系方式交流 &#x1f4dc;JAVA面试题专栏&#xff1a;JAVA崭新面试题——2024版_dream_ready的博客-CSDN博客 &#x1f4dc;作者首页&…

02_ElementUI

一.前端工程化 1.1 概述 前端工程化是使用软件工程的方法来单独解决前端的开发流程 中模块化、组件化、规范化、自动化的问题,其主要目的为了 提高效率和降低成本。 1.2 NodeJS的安装 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环 境&#xff0c;可以使 JavaS…

关于Unity使用LookAt时为什么不能旋转

使用LookAt会使物体的Z轴对准某坐标 但是X和Y轴也是定死的&#xff0c;所以这个时候你再旋转也就没有效果了 解决方法&#xff1a; 使用辅助空物体&#xff1a; 可以创建一个空物体作为父节点&#xff0c;将其对准目标位置&#xff08;使用 LookAt&#xff09;&#xff0c;…

三、运算符、数据类型转换(显式、隐式)、语句(if、三元、switch、while、for)

1. 运算符 1.1 自增自减 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> &…

数据安全、信息安全、网络安全区别与联系

关键字&#xff1a; 信息安全 数据安全 网络安全 [导读] 在 “互联网 ” 被广泛提及的今天&#xff0c;安全问题也越来越多的受到人们关注&#xff0c;然而很多人对于 “信息安全”、“数据安全”、“网络安全” 的概念并不是很清楚。我们汇总了官方机构给这三者的定义&#…

Vue.js:构建现代 Web 应用的强大框架

一、引言 在当今快速发展的 Web 开发领域&#xff0c;Vue.js 以其简洁、高效和灵活的特点脱颖而出。作为一个渐进式 JavaScript 框架&#xff0c;Vue.js 为开发者提供了一种全新的方式来构建用户界面&#xff0c;无论是小型项目还是大型企业级应用&#xff0c;Vue.js 都能发挥出…

docker 安装mongodb

docker 安装mongodb(5.0) 拉取mongodb镜像 docker pull mongo运行容器 docker run -d --name mongodb -v /mycontainers/mongodb/data:/data/db -p 27017:27017 mongo --auth^: -d : 指定后台运行 ^: --name mongodb &#xff1a;设置容器名 ^: -v /mycontainers/mongodb/d…

基于单片机的多功能视力保护器设计(论文+源码)

1. 功能设计 本次课题为多功能视力保护器&#xff0c;具体设计功能如下&#xff1a; (1)当使用者的眼睛距离写字台低于25cm时&#xff0c;报警灯闪烁以提醒使用者及时调整坐姿。 (2)学习环境光线自动检测&#xff1a;当光照强度低于1001X时&#xff0c;语音提醒使用者调整光…

关于sass在Vue3中编写bem框架报错以及警告问题记录

在编写完bem框架后 在vite.config.ts文件进行预编译处理时&#xff0c;报错的错误 1. 处理方式&#xff1a;使用新版api&#xff0c; 如图&#xff1a; 2. 处理方式&#xff1a;使用 use 替换掉 import&#xff0c; 如图&#xff1a; 3. 处理方式&#xff1a;使用路径别名&am…

接口测试框架+数据驱动

前置知识 接口测试框架 采用HTTPOk testNg 搭建而成&#xff0c;其中HttpOk 进行 http类型接口收发包&#xff0c;testNg 进行用例管理 背景 本文讲解项目中涉及到的数据驱动 项目中常用的数据驱动为DataProvider 注解进行 经常将用例所需不同的场景参数以二维数组格式给出…

SOLIDWORKS代理商鑫辰信息科技

鑫辰信息科技是一家专业的SOLIDWORKS代理商&#xff0c;致力于为客户提供全面的CAD解决方案和技术支持。作为SOLIDWORKS的授权合作伙伴&#xff0c;鑫辰信息科技在机械设计、产品开发和工程仿真等领域拥有丰富的经验和专业知识&#xff0c;能够帮助客户有效提升设计和生产效率。…

【 AI写作鹅-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

什么是 eCPRI,它对 5G 和 Open RAN 有何贡献?

这里写目录标题 eCPRI 协议平面&#xff1a;功能分解eCPRI与CPRI的区别CPRI具有以下特点&#xff1a;eCPRI具有以下特点&#xff1a;eCPRI 的优势 所需带宽减少 10 倍适用于 5G 和 Open RAN 的 eCPRI&#xff1a; 通用公共无线接口&#xff08;CPRI&#xff09;是一种行业合作&…

关键字“退出、结束、跳过”(day13)

一、break和continue的用法 1. break关键字可以用来退出switch或循环语句 不能在if语句中使用break和continue break关键字&#xff1b;会立即终止离他最近的那个循环语句 - 可以为循环语句创建一个lable&#xff0c;来标识当前的循环 lable:循环语句 使用循环语句的时&#…

《硬件架构的艺术》笔记(二):时钟与复位

本章主要针对ASIC设计给出建议&#xff0c;独立于CAD工具以及工艺&#xff0c;主要针对模块设计和存储器接口。 同步设计 这是对时钟域控制最安全的方法&#xff0c;单个主时钟和单个主置位/复位信号驱动设计中所有时序器件。 避免使用行波计数器 行波计数器&#xff1a;用触…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

什么是UDP和TCP?有什么区别?应用场景分别都有哪些?

UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;都是互联网协议套件的一部分&#xff0c;用于在网络中传输数据。它们都位于OSI模型的传输层&#xff0c;但两者在工作方式、可靠性和使用场景上存在显著差异。 UDP (User Datagram Protoc…