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

目录

一、什么是享元模式

二、享元模式的角色

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

#渗透测试#SRC漏洞挖掘#云技术基础02之容器与云

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

【Linux系统编程】第四十六弹---线程同步与生产消费模型深度解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、Linux线程同步 1.1、同步概念与竞态条件 1.2、条件变量 1.2.1、认识条件变量接口 1.2.2、举例子认识条件变量 1.2.3、…

力扣(LeetCode)283. 移动零(Java)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:雾失楼台&#xff0c;月迷津渡&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主…

如何在单片机引脚有限时拓展更多引脚

假设单片机有3个GPIO口可以使用&#xff0c;但是我现在要控制多余3个口的功能怎么办&#xff1f; 这个时候可以用到74LS138&#xff08;3 线&#xff0d;8线译码器&#xff09;&#xff1a; 这个时候我使用三位二进制位可以表示2^3 8个引脚的内容 这种方法经常用于选择数码屏…

go debug日记:protoc -I . helloworld.proto --go_out=plugins=grpc:.错误debug

使用protoc生成go的文件出现bug 运行命令 protoc -I . helloworld.proto --go_outpluginsgrpc:.如图所示 即&#xff0c;没有指定生成的go文件位置&#xff0c;需要在文件中添加 option go_package"path;name";其中 path 表示生成的go文件的存放地址&#xff0c;…

cesium渲染3DTiles模型和glb模型

cesium渲染3DTiles模型和glb模型 相关网站&#xff1a; 1.快速入门&#xff1a;https://cesium.com/learn/cesiumjs-learn/cesiumjs-quickstart/ 2.webpack配置&#xff1a;https://github.com/CesiumGS/cesium-webpack-example#cesium-webpack-example 3.说明文档&#xff…

灰狼优化算法

一、简介 1.1 灰狼优化算法-Grey Wolf Optimizer 通过模拟灰狼群体捕食行为&#xff0c;基于狼群群体协 作的机制来达到优化的目的。&#xff27;&#xff37;&#xff2f;算法具有结构简单、需 要调节的参数少、容易实现等特点&#xff0c;其中存在能够自适应调整 的收敛因子…

新日撸java三百行` 新手小白java学习记录 `Day1

新日撸java三百行新手小白java学习记录 Day1 模拟多线程回调机制 文章目录 新日撸java三百行 新手小白java学习记录 前言一 、模拟异步机制提出问题解决方案 前言 古人称长江为江&#xff0c;黄河为河。长江水清&#xff0c;黄河水浊&#xff0c;长江在流&#xff0c;黄河也在…

【Unity Bug 随记】unity version control 报 xx is not in a workspace.

可能原因是更改了仓库或者项目名称。 解决办法就是重置Unity Version Control&#xff0c;去Hub disconnect 然后重新connect cloud和UVC UVC可能连不上&#xff0c;直接进入项目就行&#xff0c;打开版本管理标签会让你重新连工作区&#xff0c;选择你的仓库和工作区 然后In…

Go语言入门教案

文章目录 一、教学目标二、教学重难点&#xff08;一&#xff09;重点&#xff08;二&#xff09;难点 三、教学方法四、教学过程&#xff08;一&#xff09;Go语言简介&#xff08;二&#xff09;环境搭建1. 下载和安装Go语言开发环境2. 配置Go语言环境变量3. 命令行查看Go语言…

[2024最新] java八股文实用版(附带原理)---java集合篇

介绍一下常见的list实现类&#xff1f; ArrayList 线程不安全&#xff0c;内部是通过数组实现的&#xff0c;继承了AbstractList&#xff0c;实现了List&#xff0c;适合随机查找和遍历&#xff0c;不适合插入和删除。排列有序&#xff0c;可重复&#xff0c;当容量不够的时候…

7天用Go从零实现分布式缓存GeeCache(学习)(3)

目录结构 ├── geecache │ ├── byteview.go │ ├── cache.go │ ├── consistenthash │ │ ├── consistenthash.go │ │ └── consistenthash_test.go │ ├── geecache.go │ ├── go.mod │ ├── http.go │ ├── lru │ …

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示&#xff1a;   OpenHarmony(简称OH)的标准系统的底层系统是linux&#xff0c;所以调用如下代码&#xff1a; linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

HTB:Precious[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 使用curl访问靶机80端口 使用ffuf爆破一下子域 使用浏览器访问该域名 使用curl访问该域名响应头 使用exiftool工具查看该pdf信息 横向移动 USER_FLAG&#xff1a;adf5793a876a190f0c08b3b6247cec32…

jsmind 思维导图 + monaco-editor + vue3 + ts

Index.vue: <template><div class"m-jsmind-wrap"><div class"m-jsmind-header"><el-button type"primary" click"() > handleReset()">重置</el-button><el-button type"primary" cl…

在arm64架构下, Ubuntu 18.04.5 LTS 用命令安装和卸载qt4、qt5

问题&#xff1a;需要在 arm64下安装Qt&#xff0c;QT源码编译失败以后&#xff0c;选择在线安装&#xff01; 最后安装的版本是Qt5.9.5 和QtCreator 4.5.2 。 一、ubuntu安装qt4的命令(亲测有效)&#xff1a; sudo add-apt-repository ppa:rock-core/qt4 sudo apt updat…

AIGC学习笔记(5)——AI大模型开发工程师

文章目录 AI大模型开发工程师004 垂直领域的智能在线搜索平台1 智能在线搜索平台需求分析大模型不够“聪明”增强大模型的方式需求分析2 智能在线搜索平台方案设计方案设计技术选型大模型版本GLM-4大模型注册使用Google Cloud平台注册创建可编程的搜索引擎3 智能在线搜索平台代…

【React】状态管理之Redux

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 状态管理之Redux引言1. Redux 的核心概念1.1 单一数据源&#xff08;Single Sou…

Unity类银河战士恶魔城学习总结(P124 CharacterStats UI玩家的UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了玩家属性栏&#xff0c;仓库&#xff0c;物品栏UI的制作 UI_StatSlot.cs 这个脚本是用来在Unity的UI上显示玩家属性&#xf…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…