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

Java二十三种设计模式-享元模式(12/23)

享元模式:高效管理大量对象的设计模式

引言

在软件开发中,有时需要处理大量相似或重复的对象,这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案,通过共享对象的共同部分来减少内存占用。

基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:享元模式概述

1.1 定义与特点

享元模式的基本定义

享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

享元模式是一种结构型设计模式,旨在通过共享来减少创建大量相似或相同对象时的内存消耗。这种模式通过共享对象的共有部分来实现对象的复用,从而降低系统资源的使用。

特点

  • 共享不变部分:享元模式的核心在于识别对象的共有特性,并在多个对象之间共享这些特性,而不是为每个对象独立创建。
  • 减少对象数量:通过共享对象,减少了系统中对象的总数量,降低了内存占用和垃圾回收的负担。
  • 细粒度对象:特别适用于大量细粒度对象的场景,例如字体渲染、图形用户界面中的图标等。

1.2 应用场景

何时适合使用享元模式

  • 大量相似对象:当系统中存在大量相似或相同的对象时,使用享元模式可以显著减少内存消耗。
  • 对象创建成本高:如果对象的创建过程复杂或成本高昂,享元模式可以通过共享来降低这些成本。
  • 对象状态外部化:当对象的状态可以被外部化,即对象的行为可以通过外部状态参数化,而不是依赖于对象内部状态时。

应用实例

  • 文本编辑器:在文本编辑器中,字符可以作为享元,因为文档中可能存在大量重复的字符。
  • 图形界面:在GUI设计中,按钮、图标等界面元素可能在多个地方重复使用,通过享元模式可以减少这些元素的内存占用。
  • 游戏开发:游戏中的敌人、树木、建筑等元素可能在多个场景中重复出现,享元模式可以有效地管理这些资源。

享元模式通过共享对象的共有部分来减少内存占用,提高资源使用效率。然而,这种模式也增加了系统的复杂性,需要仔细设计以确保对象的共享部分不会影响其独立性。在下一部分中,我们将详细介绍享元模式的组成部分和实现方式。

第二部分:享元模式的组成

2.1 角色定义

享元(Flyweight)

  • 定义:享元是实现共享的对象,它包含了可以被多个对象共享的内部状态。
  • 特点:享元对象通常很轻量,不包含任何唯一性的状态。

享元工厂(Flyweight Factory)

  • 定义:享元工厂负责创建和管理享元对象,确保享元对象可以被正确地共享和复用。
  • 特点:享元工厂维护一个享元对象池,用于存储和检索享元对象。

客户端(Client)

  • 定义:客户端是使用享元对象的代码,它通过享元工厂来请求所需的享元对象。
  • 特点:客户端不直接创建享元对象,而是通过享元工厂来获取。

2.2 职责分配

享元的职责

  • 维护内部状态:享元对象负责维护可以被共享的状态,如不变的数据或行为。
  • 接受外部状态:享元对象可以接受外部状态,这些状态通常在享元对象被使用时传递。

享元工厂的职责

  • 创建享元对象:享元工厂负责创建享元对象,确保不会创建重复的对象。
  • 管理对象池:享元工厂维护一个对象池,存储已经创建的享元对象,以便复用。
  • 分配享元对象:享元工厂负责根据客户端的请求分配享元对象,确保对象的正确共享。

客户端的职责

  • 请求享元对象:客户端通过享元工厂请求所需的享元对象。
  • 传递外部状态:客户端负责传递享元对象所需的外部状态,以便享元对象可以正确执行操作。
  • 使用享元对象:客户端使用从享元工厂获取的享元对象来执行所需的任务。

通过这种职责分配,享元模式能够有效地管理大量对象,减少内存消耗,并提高系统性能。在下一部分中,我们将通过Java代码示例来展示享元模式的具体实现。

第三部分:享元模式的实现

3.1 Java实现示例

以下是使用Java语言实现享元模式的代码示例。在这个例子中,我们将创建一个简单的文本编辑器,其中字符是享元对象。

// 享元接口
interface Flyweight {void print(String extrinsicState);
}// 具体享元类
class ConcreteFlyweight implements Flyweight {private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void print(String extrinsicState) {System.out.println("Character: " + intrinsicState + " with intrinsic state: " + this.intrinsicState);}
}// 享元工厂
class FlyweightFactory {private HashMap<String, Flyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(String key) {if (!flyweights.containsKey(key)) {flyweights.put(key, new ConcreteFlyweight(key));}return flyweights.get(key);}
}// 客户端代码
public class Client {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();Flyweight characterA = factory.getFlyweight("A");characterA.print("Bold");Flyweight characterB = factory.getFlyweight("B");characterB.print("Italic");}
}

3.2 设计考虑

享元对象的共享性

  • 内部状态:享元对象的内部状态应该是共享的,并且不随环境改变而改变。
  • 外部状态:享元对象的外部状态应该由客户端提供,并且可以随环境变化。

享元工厂的设计

  • 对象池管理:享元工厂需要管理一个对象池,以存储和复用享元对象。
  • 线程安全:在多线程环境中,享元工厂需要确保线程安全。

享元对象的创建

  • 延迟初始化:享元对象的创建可以延迟到第一次使用时,以节省资源。
  • 对象复用:确保享元对象在不再使用时可以被回收并复用于其他客户端。

享元模式的灵活性

  • 扩展性:享元模式应允许新类型的享元对象容易地添加到系统中。
  • 兼容性:新添加的享元对象应与现有客户端代码兼容。

避免过度共享

  • 识别共享部分:正确识别哪些部分可以共享,哪些部分应该是唯一的。
  • 性能权衡:过度共享可能导致性能问题,如同步开销。

享元模式的适用性

  • 对象数量:评估系统中对象的数量,确定是否值得使用享元模式。
  • 对象大小:如果对象较小,享元模式可能不会带来显著的性能提升。

通过考虑这些设计问题,你可以更有效地实现享元模式,确保它为你的应用程序带来内存和性能上的好处。在下一部分中,我们将探讨享元模式的使用场景、优点与缺点。

第四部分:享元模式的使用场景

4.1 内存敏感的应用

在内存敏感的应用中,享元模式发挥着至关重要的作用,尤其是在资源受限的环境中。

讨论在内存敏感的应用中享元模式的应用:

  • 移动设备:在移动应用开发中,由于内存限制,享元模式可以用来减少内存消耗。
  • 嵌入式系统:在嵌入式系统中,内存和处理能力有限,使用享元模式可以提高效率。
  • 大型数据处理:在处理大规模数据集时,享元模式可以减少创建和销毁对象的开销。

应用实例:

  • 图像处理软件:在图像处理中,像素可以作为享元对象,通过共享减少内存使用。
  • 游戏开发:游戏中的敌人或道具,如果具有相似的行为和外观,可以共享实现。

4.2 大量相似对象的管理

当应用程序需要管理大量相似的对象时,享元模式可以显著提高内存使用效率和性能。

分析在需要管理大量相似对象时,享元模式的优势:

  • 减少内存占用:通过共享相似对象的共有状态,减少了内存占用。
  • 提高性能:减少了对象创建和销毁的时间,提高了程序性能。
  • 简化对象管理:享元工厂提供了一个集中的点来管理对象的创建和复用。

应用实例:

  • 文本编辑器:文本中的字符如果重复出现,可以作为享元对象来处理。
  • 图形界面:GUI组件如按钮、图标等,如果样式和行为相同,可以共享实现。

优势详解:

  • 对象池:享元模式通过对象池来管理对象,避免了频繁的创建和销毁。
  • 细粒度控制:享元模式允许对对象的细粒度控制,可以针对特定状态进行优化。
  • 灵活性:享元模式提供了在不增加额外内存负担的情况下扩展对象功能的能力。

通过这些使用场景的讨论,我们可以看到享元模式在处理大量相似对象时的优势。然而,也要注意享元模式可能会增加系统的复杂性,并且在某些情况下可能不是最佳解决方案。在下一部分中,我们将探讨享元模式的优点与缺点。

第五部分:享元模式的优点与缺点

5.1 优点

减少内存消耗

  • 共享对象:通过共享对象的内部状态,减少了内存中对象的总数量。
  • 对象复用:享元模式允许对象在不同地方被复用,避免了重复创建相同对象。

提高性能

  • 减少创建时间:由于减少了对象的创建,享元模式可以降低系统的响应时间。
  • 快速响应:对象的快速获取和释放可以提高应用程序的交互性能。

降低系统成本

  • 资源优化:在资源受限的环境中,享元模式可以显著降低系统运行成本。

提高代码的可维护性

  • 集中管理:享元工厂提供了对象的集中管理,简化了对象的创建和维护。

易于扩展

  • 添加新对象:新类型的享元对象可以很容易地添加到系统中,而不影响现有代码。

5.2 缺点

增加系统复杂性

  • 设计复杂性:享元模式增加了设计的复杂性,需要仔细规划内部状态和外部状态的分离。

过度共享的风险

  • 共享状态管理:如果共享状态管理不当,可能会导致数据不一致或竞态条件。

灵活性降低

  • 修改困难:一旦享元对象被广泛使用,对其进行修改可能会变得困难。

性能权衡

  • 同步开销:在多线程环境中,共享对象可能需要额外的同步机制,这可能会影响性能。

不适用于所有场景

  • 独特对象:如果对象之间的差异性很大,享元模式可能不是最佳选择。

难以识别享元对象

  • 内部状态识别:有时难以识别哪些部分是共享的内部状态,哪些是外部状态。

可能影响缓存

  • 缓存策略:享元模式可能会影响系统的缓存策略和内存访问模式。

享元模式是一种强大的设计模式,可以显著减少内存消耗并提高性能,特别是在处理大量相似对象的场景中。然而,它也需要谨慎使用,以避免增加系统的复杂性和维护难度。在实际应用中,根据具体需求和场景选择是否使用享元模式是非常重要的。在下一部分中,我们将比较享元模式与其他设计模式,并提供一些最佳实践和建议。

第六部分:享元模式与其他模式的比较

6.1 与单例模式的比较

单例模式

  • 定义:单例模式确保一个类只有一个实例,并提供一个全局访问点。
  • 使用场景:当需要严格控制资源数量,如配置管理器或全局缓存时。

享元模式

  • 定义:享元模式通过共享来高效地支持大量细粒度对象的复用。
  • 使用场景:当需要创建大量相似或可共享的对象时。

对比

  • 对象数量:单例模式限制对象只能有一个实例,而享元模式可以有多个实例,但通过共享来减少数量。
  • 共享机制:单例模式不涉及对象的共享,享元模式则依赖于对象的共享。
  • 目的:单例模式用于控制对象的创建数量,享元模式用于减少对象的内存占用。

6.2 与原型模式的对比

原型模式

  • 定义:原型模式使用原型实例指定创建对象的种类,通过复制这些原型创建新的对象。
  • 使用场景:当创建新对象的成本较高,或者需要快速复制现有对象时。

享元模式

  • 定义:享元模式通过共享不变的内部状态来减少对象的创建。
  • 使用场景:适用于创建大量相似对象,且对象的内部状态可以共享。

对比

  • 复用方式:原型模式通过复制原型来创建新对象,享元模式通过共享已有对象来复用。
  • 共享程度:原型模式通常用于完全独立的复制,享元模式则侧重于共享不变的状态。

第七部分:享元模式的最佳实践和建议

7.1 最佳实践

合理划分内部状态和外部状态

  • 内部状态:应为共享状态,不随对象的使用环境改变而改变。
  • 外部状态:应为瞬时状态,可以随享元对象的使用而变化,不影响其他对象。

确保享元对象的不变性

  • 不变对象:保持享元对象的状态不可变,确保共享的安全性。

使用享元工厂管理对象

  • 对象池:享元工厂应维护一个对象池,以便存储和复用享元对象。

避免外部状态的误用

  • 参数化:确保外部状态通过参数传递,避免错误地修改享元对象的内部状态。

保持享元对象的轻量级

  • 轻量设计:享元对象应设计得尽可能轻量,避免包含大量资源消耗。

考虑线程安全

  • 并发访问:在多线程环境中使用享元模式时,确保享元对象的线程安全。

7.2 避免滥用

避免过度设计

  • 简单问题复杂化:对于不需要共享的对象,避免使用享元模式,以免增加不必要的复杂性。

避免共享不当

  • 错误共享:避免将不应该共享的状态共享,这可能会导致数据不一致。

避免忽视性能影响

  • 性能评估:在引入享元模式之前,评估其对性能的实际影响,确保它确实能带来性能上的提升。

7.3 替代方案

使用对象池

  • 对象复用:对象池是另一种管理对象生命周期的方式,适用于需要频繁创建和销毁对象的场景。

采用原型模式

  • 快速复制:当对象的创建成本较高时,可以使用原型模式来快速复制已有对象。

依赖注入

  • 控制反转:依赖注入可以减少对象创建的复杂性,提高系统的灵活性和可测试性。

状态模式

  • 状态变化:当对象的状态变化复杂时,可以使用状态模式来管理对象的状态转换。

享元模式与组合模式结合

  • 部分-整体层次:在需要表示部分-整体结构时,可以结合使用享元模式和组合模式。

享元模式是一种强大的设计模式,可以在需要高效管理大量对象时减少内存消耗和提高性能。然而,合理使用享元模式并避免其缺点是至关重要的。了解其替代方案可以帮助开发者根据具体需求和场景选择最合适的设计模式。在实际开发中,应根据具体情况灵活运用享元模式,以达到最佳的设计效果。

结语

享元模式是一种有效的设计模式,用于通过共享来减少大量对象的内存占用。通过本文的深入分析,希望读者能够对享元模式有更全面的理解,并在实际开发中做出合理的设计选择。

博主还写了其他Java设计模式文章,请各位大佬批评指正:

(一)创建型模式(5种):

Java二十三种设计模式-单例模式(1/23)

Java二十三种设计模式-工厂方法模式(2/23)

Java二十三种设计模式-抽象工厂模式(3/23)

Java二十三种设计模式-建造者模式(4/23)

Java二十三种设计模式-原型模式(5/23)

(二)结构型模式(7种): 

Java二十三种设计模式-适配器模式(6/23)

Java二十三种设计模式-装饰器模式(7/23)

Java二十三种设计模式-代理模式(8/23)

Java二十三种设计模式-外观模式(9/23)

Java二十三种设计模式-桥接模式(10/23)

Java二十三种设计模式-组合模式(11/23)

Java二十三种设计模式-享元模式(12/23)

相关文章:

Java二十三种设计模式-享元模式(12/23)

享元模式&#xff1a;高效管理大量对象的设计模式 引言 在软件开发中&#xff0c;有时需要处理大量相似或重复的对象&#xff0c;这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案&#xff0c;通过共享对象的共同部分来减少内存占用。 基础知识&#xff0c…...

腾讯云AI代码助手助力软件开发体验分享

引言 现在&#xff0c;AI工具在软件开发中变得越来越重要&#xff0c;它们能显著提升效率和代码质量。本文就来分享一下我用腾讯云AI代码助手的经历&#xff0c;看看它是怎么在开发中帮了大忙的。 开发环境介绍 这次的项目用的是JavaScript&#xff0c;开发环境是Windows 10…...

Leetcode力扣刷题——182.查找重复的电子邮箱

题目 编写解决方案来报告所有重复的电子邮件。 请注意&#xff0c;可以保证电子邮件字段不为 NULL。 以 任意顺序 返回结果表。 结果格式如下例。 结果 # Write your MySQL query statement below select Email from Person group by email having count(*)>1; 知识点 c…...

idea中好用的插件

输入法自动切换插件 自动切换输入法插件&#xff1a;Smart Input。编写代码时自动切换到英文输入法&#xff0c;注释代码自动切换为中文输入法。极大的提升我们的编码效率。 MyBatisX插件 MybatisX 是一款基于 IDEA 的快速开发插件&#xff0c;为效率而生。主要用于XML映射配…...

spring 代码执⾏ (CVE-2018-1273)漏洞

一 漏洞简介 Spring Data 是⼀个⽤于简化数据库访问&#xff0c;并⽀持云服务的开源框架&#xff0c;Spring Data Commons 是 Spring Data 下所有⼦项⽬共享的基础框架。Spring Data Commons 在 2.0.5 及 以前版本中&#xff0c;存在⼀处 SpEL 表达式注⼊漏洞&#xff0c;攻击…...

幺麻子曲折上市路:毛利率近四年下滑不少,存货出现较大增长

《港湾商业观察》廖紫雯 近期&#xff0c;幺麻子食品股份有限公司&#xff08;以下简称&#xff1a;幺麻子&#xff09;申请股票在全国股份转让系统挂牌并公开转让&#xff0c;拟挂牌新三板。 幺麻子此前上市之路可谓一波三折。2022年9月&#xff0c;公司向四川证监局提交辅导…...

Sol盗u、sol链上的USDT盗窃:警惕恶意智能合约

随着区块链技术的普及&#xff0c;Solana链上的应用和用户数量不断增加。然而&#xff0c;这也为不法分子提供了可乘之机&#xff0c;恶意智能合约逐渐成为盗取USDT等加密资产的一种常见手段。本文将详细介绍恶意智能合约的工作原理&#xff0c;并提供防范措施&#xff0c;帮助…...

jupyter for c++

jupyter for c++ jupyter for c++ jupyter for c++配置环境问题参考文档配置环境 需要 clang 编译器 安装 aconda 默认情况下,anaconda navigator包与anaconda Distribution一起安装,并包含依赖包qt。默认情况下,qt的所有依赖项也应安装,但某些版本的Anaconda Distribution…...

TCP Analysis Flags 之 TCP Window Full

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…...

相关性检验

文章目录 Pearson相关系数Spearman等级相关系数Cochrans Q检验Kappa一致性系数Kendall相关系数实例分析总结 在数据分析的广阔天地中&#xff0c;相关性检验是探索变量间关系的一把钥匙。本文将带领大家了解几种常用的相关性检验方法&#xff1a;Pearson、Spearman、Cochran’s…...

【python】Django运行报错分析:ImproperlyConfigured 错误解决办法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

AS01/AS11 创建固资和子资产

AS01&#xff1a;创建资产卡片 定义该资产的折旧费用&#xff0c;应该归结到哪个成本中心。 如果一台设备停止使用&#xff0c;可以勾选。停止折旧。 该界面维护折旧码和折旧的时间。 维护完之后点击保存。 系统生成一个资产卡片号。 AS02-修改资产卡片号 更改不同时间段&…...

vue3数字动画插件countup.js

countup.js 是一个轻量级的 JavaScript 库&#xff0c;允许你为网站上显示统计数据或计数器时平滑地动画化数字。CountUp 类被用来创建计数器实例&#xff0c;可以平滑地从一个数值变化到另一个数值。 只是用户视觉更好一些。 1、安装插件 npm i countup.js2、个人是封装了组件…...

aspeed2600 GPIO分析与适配ipmitool power status, ipmitool power on/off

1.说明 本节以x86-power-control/src/power_control.cpp为基础&#xff0c;分析整个GPIO的调用流程&#xff0c;实现简单的ipmitool power on/off,ipmitool power status的管理。 1.资源:x86-power-control:https://github.com/openbmc/x86-power-control2.相关文件: meta-ph…...

在C#中配置ini文件以及封装ini类

在C#中使用 DllImport 属性从 kernel32.dll 导入函数来写入和读取Windows的INI文件&#xff0c;你可以使用 WritePrivateProfileString 来写入数据&#xff0c;使用 GetPrivateProfileString 来读取数据。 以下是如何使用这些函数的示例&#xff1a; 写入INI文件 using Syst…...

使用git上传代码到github

1、设置用户名及邮箱 git config user.name"你的用户名"git config user.email"xxxxx.com" 2、查看配置 git config -l 3、生成秘钥 ssh-keygen -t rsa 根据上图中红框标出的id_rsa.pub地址&#xff0c;找到它&#xff0c;使用txt文件打开&#xff0c;复…...

滚珠花键:新能源汽车传动系统的核心动力传递者

在日常生活中&#xff0c;汽车已经成为了必不可少的交通工具&#xff0c;尤其是新能源汽车。而滚珠花键作为传动系统中的重要组成部分&#xff0c;在传动系统方面的作用不容忽视。 随着科技的不断发展&#xff0c;汽车行业也在不断进步&#xff0c;滚珠花键作为高精度的机械传动…...

LeetCode 149, 347, 31

文章目录 149. 直线上最多的点数题目链接标签思路总体思路如何判断 一个点 在 由两点确定的直线 上 代码 347. 前 K 个高频元素题目链接标签思路代码 31. 下一个排列题目链接标签思路代码 149. 直线上最多的点数 题目链接 149. 直线上最多的点数 标签 几何 数组 哈希表 数学…...

操作系统(信号处理)

一、信号介绍 什么是中断&#xff1a; 当进程接收到消息后中止当前正在执行的任务&#xff0c;转而执行其它任务&#xff0c;等待其它任务执行完毕后再返回继续执行。这种执行模式称为中断&#xff0c;分为硬件中断和软件中断两种 什么是信号&#xff1a; 信号是UNIX、类UNI…...

[MRCTF2020]Ezpop

[MRCTF2020]Ezpop 题目是pop&#xff0c;考的其实就是pop链&#xff0c;可以自己先学学&#xff0c;啥也不会QAQ php反序列化之pop链_pop3.phpwelcome-CSDN博客 POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法&#xff0c;与二进制利用…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...