当前位置: 首页 > news >正文

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

目录

一、什么是享元模式

二、享元模式的角色

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

四、享元模式在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对象就是享元对象与外部状态(任务)之间的桥梁。

相关文章:

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

目录 一、什么是享元模式 二、享元模式的角色 三、享元模式的典型应用场景 四、享元模式在ThreadPoolExecutor中的应用 1. 享元对象&#xff08;Flyweight&#xff09;- 工作线程&#xff08;Worker&#xff09; 2. 享元工厂&#xff08;Flyweight Factory&#xff09;- …...

2024大兴区火锅美食节即将开幕——品味多元火锅,点燃冬季消费热潮

为响应“中国国际精品消费月”活动&#xff0c;由大兴区商务局主办、大兴区餐饮行业协会承办的2024大兴区火锅美食节将于11月15日正式启动&#xff0c;为期一个半月的美食盛宴将在大兴区掀起一场冬日的火锅热潮。此次火锅节作为北京市“食在京城、沸腾火锅”火锅美食节的重要组…...

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…...

VS2022项目配置笔记

文章目录 $(ProjectDir&#xff09;与 $(SolutionDir) 宏附加包含目录VC目录和C/C的区别 $(ProjectDir&#xff09;与 $(SolutionDir) 宏 假设有一个解决方案 MySolution&#xff0c;其中包含两个项目 ProjectA 和 ProjectB&#xff0c;目录结构如下&#xff1a; C:\Projects\…...

springboot029基于springboot的网上购物商城系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 基于…...

网站访问在TCP/IP四层模型中的流程

访问一个网站的过程可以通过 TCP/IP 网络模型来描述。TCP/IP 模型通常被分为四层&#xff1a;应用层、传输层、网络层和链路层。以下是从这些层级的角度描述你访问一个网站时所发生的过程&#xff1a; 1. 应用层 (Application Layer) 当你在浏览器中输入一个 URL&#xff08;…...

C++笔记---包装器

1. 什么是包装器 C中的包装器是一种设计模式&#xff0c;用于将一个复杂或底层的接口进行封装&#xff0c;以便提供一个更简洁、易用的接口。包装器可以包装任何类型的可调用实体&#xff0c;如函数&#xff0c;成员函数&#xff0c;函数指针&#xff0c;仿函数对象&#xff0…...

算力与能量的全分布式在线共享来降低5G网络的用电成本。基于随机对偶次梯度法的多时隙约束耦合问题解耦方法示例;随机对偶次梯度法的在线管理策略

目录 算力与能量的全分布式在线共享来降低5G网络的用电成本。 基于随机对偶次梯度法的多时隙约束耦合问题解耦方法示例 随机对偶次梯度法的在线管理策略 策略概述 具体步骤 示例说明 算力与能量的全分布式在线共享来降低5G网络的用电成本。 主要探讨了5G网络与边缘计算设…...

海鲜特写镜头视频素材去哪找 热门视频素材网站分享

作为美食自媒体创作者&#xff0c;海鲜特写镜头的视频素材无疑是提升内容吸引力和质量的重要利器。无论你想展示新鲜的海鲜原料、精美的烹饪过程&#xff0c;还是诱人的餐桌美食&#xff0c;精致的海鲜特写镜头都能极大地吸引观众的注意力。那么&#xff0c;问题来了&#xff1…...

JMM内存模型(面试回答)

1.什么是JMM JMM就是Java内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下&#xff0c;内存的访问有一定的差异&#xff0c;所以会造成相同的代码运行在不同的系统上会出现各种问题。所以Java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异&…...

Greiner 经典力学(多体系统和哈密顿力学)第十二章 学习笔记(Rotation About a Point)

第十二章 学习笔记&#xff08;Rotation About a Point&#xff09; 上一章是绕定轴转动&#xff0c;这章是绕定点转动。这一章明显上难度了。 12.1 Tensor of Inertia 在正式的公式推导之前&#xff0c;我们先复习一个矢量公式&#xff0c;下面推导时会用到这个公式&#x…...

SQL进阶技巧:如何计算复合增长率?

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 复合增长率是第N期的数据除以第一期的基准数据,然后开N-1次方再减去1得到的结果。假如2018年的产品销售额为10000,2019年的产品销售额为12500,2020年的产品销售额为15000(销售额单位省略,下同)​。那么这两…...

十一:java web(3)-- Spring框架 -- Spring简介

目录 1. Servlet 与 Spring 的关系 2. Spring 框架介绍 Spring 框架的起源与发展 Spring 框架的核心特性 Spring 主要模块介绍 核心模块&#xff08;Core Container&#xff09; 数据访问与集成模块&#xff08;Data Access/Integration&#xff09; Web 模块&#xff0…...

ts 如何配置引入 json 文件

ts 如何配置引入 json 文件 参考文档&#xff1a; https://maxgadget.dev/article/how-to-import-a-json-file-in-typescript-a-comprehensive-guide 项目中有一个 .json 的文件是配置文件&#xff0c;如何引入到 ts 项目中 配置 tsconfig.json 文件&#xff0c;添加这两个 {…...

LeetCode面试经典150题C++实现,更新中

用C实现下面网址的题目 https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1、数组\字符串 88合并两个有序数组 以下是使用 C 实现合并两个有序数组的代码及测试用例 C代码实现 #include <iostream> #include &l…...

基于springboot的家装平台设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

CSS的配色

目录 1 十六进制2 CSS中的十六进制2.1 十六进制颜色的基本结构2.2 十六进制颜色的范围2.3 简写形式2.4 透明度 3 CSS的命名颜色4 配色4.1 色轮4.2 互补色4.3 类似色4.4 配色工具 日常在开发小程序中&#xff0c;客户总是希望你的配色是美的&#xff0c;但是美如何定义&#xff…...

Parallax.js:让智能设备视差效果更智能、更自然

今天给大家分享一款功能非常强大的javascript视觉差特效引擎插件&#xff1a;Parallax.js。 Parallax.js简介 Parallax.js是一个简单的&#xff0c;轻量级的视差引擎。你可以将它作为作为jQuery或Zepto插件来使用&#xff0c;也可以以纯JS的方式来使用。 最-最-最厉害的是它…...

一文熟悉新版llama.cpp使用并本地部署LLAMA

0. 简介 最近是快到双十一了再给大家上点干货。去年我们写了一个大模型的系列&#xff0c;经过一年&#xff0c;大模型的发展已经日新月异。这一次我们来看一下使用llama.cpp这个项目&#xff0c;其主要解决的是推理过程中的性能问题。主要有两点优化&#xff1a; llama.cpp …...

vue/react做多语言国际化的时候,在语言配置中不同的语言配置不同的字体,动态引入scss里面

如果想直接在vue文件的css里面使用&#xff0c;就可以使用i18n的t函数&#xff0c;注意t外层也有引号&#xff1a; font-size: v-bind("t(style.teamCurModelFontSize)"); 前提是要引入t函数&#xff1a;...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...