Message的复用

前言

在Android开发中,Message作为Handler通信机制的核心组件之一,其创建方式的选择直接影响着应用的性能表现。传统的新建实例方式(new Message())虽然直观,但在频繁的消息传递场景下可能会引发大量的对象创建与销毁,进而增加垃圾回收的压力和内存分配开销。因此,Android框架为我们提供了一个更加高效的替代方案——通过Message类的静态方法obtain()来获取消息实例。本文将深入解析obtain()方法的工作原理及其背后的设计。

Message.obtain()的精妙之处

Message.obtain()方法巧妙地运用了对象池技术,这是一种旨在减少频繁对象创建与销毁所带来性能损耗的设计模式。下面是对该方法的详细剖析:

线程安全保证

  • 同步控制:方法通过在定义上添加synchronized关键字,确保了在多线程环境下的线程安全性。这意呀着无论多少线程同时尝试调用obtain(),系统都会保证它们按顺序执行,避免了数据竞争和不一致的问题。

对象池的魔法

  • 资源预分配Message.obtain()的核心在于其内部维护的一个消息对象池。这个池预先创建了一定数量的Message对象,并将它们链接在一起。每个Message对象都有一个next字段,形成了一个链表结构,方便管理和复用。

复用逻辑解析

  1. 锁住池访问:通过锁定sPoolSync对象,确保对消息池的操作是原子性的,即任何时刻只有一个线程能够访问池。
  2. 检查与提取:检查池中是否有可用对象。如果有,就从链表头部摘取一个对象(m = sPool),更新池的头部指针,并断开该对象与池的链接。
  3. 重置对象状态:清除摘取对象的next引用和flags标志位,确保对象处于干净、可复用的状态。
  4. 资源计数调整:每当一个对象被复用,池的大小计数器sPoolSize会递减,记录当前池中剩余的可复用对象数量。
  5. 新建对象的最后防线:如果池中无可用对象,则通过常规的new Message()方式创建新对象,确保消息的供应不间断。

资源优化效果

  • 性能提升:通过对象复用,大幅度减少了运行时的内存分配和垃圾回收频率,尤其是在消息处理密集的应用场景下,如UI更新、后台任务调度等,有效提升了应用的运行效率和响应速度。
  • 内存****管理优化:减轻了JVM的管理负担,避免了频繁的内存碎片化问题,对于长时间运行的服务或应用尤为重要。

总结

Message.obtain()不仅是Android开发中一个高效的消息创建策略,更是面向性能优化设计思想的典型体现。它通过简单而高效的对象池模式,最大限度地减少了对象创建的开销。

扩展

享元模式(Flyweight Pattern)是设计模式中的一种,它的核心思想是通过共享技术有效地支持大量细粒度对象的复用。换句话说,享元模式致力于减少创建对象的数量,特别是那些具有相同或相似状态的对象,从而节约内存空间和提高程序效率。它尤其适用于存在大量相似对象的场景,比如文本编辑器中的字符、游戏中的子弹等。

通俗解释

想象一下,你在玩一款射击游戏,游戏中每发射一颗子弹,如果都创建一个新的子弹对象,那么随着游戏的进行,会有成千上万颗子弹对象被创建和销毁,这无疑会消耗大量的内存资源。但事实上,大部分子弹除了位置等少数属性不同外,其他属性如外观、速度等都是相同的。享元模式的做法是,预先创建好几种不同类型的子弹对象(这些是享元对象),游戏运行时,每当需要显示一颗新的子弹时,就从享元池中获取一个已经存在的、类型匹配的子弹对象,仅改变其位置等可变属性,然后使用,这样就大大减少了对象的创建数量。

示例代码

下面是一个简单的享元模式示例,我们以文字处理软件中的字符为例。假设文档中有很多重复的字符,我们不需要为每个字符创建一个新的对象,而是通过享元模式复用字符对象。

// 享元接口
interface Character {void display(int pointX, int pointY);
}// 具体享元角色 - 字符实现类
class ConcreteCharacter implements Character {private char character;public ConcreteCharacter(char character) {this.character = character;}@Overridepublic void display(int pointX, int pointY) {System.out.println("在位置 (" + pointX + ", " + pointY + ") 显示字符 '" + character + "'");}
}// 享元工厂类
class CharacterFactory {private Map<Character, ConcreteCharacter> pool = new HashMap<>();public Character getCharacter(char character) {ConcreteCharacter concreteCharacter = pool.get(character);if (concreteCharacter == null) {concreteCharacter = new ConcreteCharacter(character);pool.put(character, concreteCharacter);}return concreteCharacter;}
}// 客户端代码
public class FlyweightPatternDemo {public static void main(String[] args) {CharacterFactory factory = new CharacterFactory();// 创建并显示字符 'A' 的多个实例Character charA1 = factory.getCharacter('A');charA1.display(10, 20);Character charA2 = factory.getCharacter('A');charA2.display(30, 40);// 尽管请求了两次'A',但实际只创建了一个'A'的实例}
}

在这个例子中,ConcreteCharacter代表具体的享元角色,每个字符都是一个享元对象;CharacterFactory作为享元工厂,负责创建和管理享元对象,确保相同字符的实例只会被创建一次,并通过一个Map来缓存这些实例,实现了对象的复用。

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

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

相关文章

图像交换部分区域或帧

生成一个boundingbox&#xff0c;或区间 给定矩形框占图像的面积比例&#xff0c;和图像的宽W高H&#xff0c;生成矩形框。根据给定的矩形框&#xff0c;交换两张图像的部分区域。 这里为了方便展示&#xff0c;简化问题&#xff0c;给定一个图像数组mels&#xff0c;对第 i …

【第2章】SpringBoot实战篇之接口参数校验和全局异常处理

文章目录 前言一、参数校验1. 引入库2. 全局异常处理3. 控制器类4. 响应 二、对象校验1.实体类2.控制器类3. 全局异常处理4. 响应 总结 前言 对接口请求参数校验是每一个开发人员都必须熟知且善用的功能&#xff0c;是保证程序健壮性的基石。 除引入方式不同&#xff0c;使用…

从零到一的程序猿-day2-yoloV4训练及免环境易语言调用

简介 本项目功能介绍&#xff1a;针对4位英文数字随机组合的验证码抽象图片进行分类识别&#xff0c;识别结果为验证码内容 训练 没有难度&#xff0c;手动标注&#xff0c;样本为150张&#xff0c;首先识别出图片中每个英数的位置&#xff0c;再由分类器进行标注识别&#x…

Github:ChatTTS从下载到使用

前言 本文使用工具&#xff1a; Anaconda &#xff1a;直接进行包管理&#xff0c;用来自定义生成python解释器&#xff0c;虚拟环境vscode&#xff1a;用来执行代码 注&#xff1a;我使用的Ubuntu&#xff0c;使用win&#xff0c;mac等&#xff0c;需要额外配置 简介 Chat…

【环境栏Composer】Composer常见问题(持续更新)

1、执行composer install提示当前目录中没有 composer.lock 文件时 No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. Composer 在执行 install 命令时会…

浅谈大模型的优缺点以及优化方法

引言 人工智能大模型&#xff0c;如深度学习模型、神经网络模型等&#xff0c;已经改变了我们对数据处理和分析的方式。然而&#xff0c;尽管它们在各种应用中表现出色&#xff0c;但也存在一些挑战和限制。本文将详细探讨人工智能大模型的优点和缺点&#xff0c;并提出一些方…

【第六节】C++中的模板

目录 前言 一、函数模板 二、模块特化 三、重载函数模板 四、类模板 五、总结 前言 模板是C编程中的一种强大工具&#xff0c;它允许程序员创建具有通用数据类型的函数库和类库。作为支持参数多态性的机制&#xff0c;模板极大地增强了代码的复用性和灵活性。 在C语言中&#x…

Pytorch线性回归

使用pytorch来重现线性模型的过程&#xff0c;构造神经网络module&#xff0c;构造损失函数loss&#xff0c;构造随机梯度下降的优化器sgd。 一 revise 首先确定我们的模型&#xff0c;我们希望完成的目标就是得到较小的loss&#xff0c;所以我们就需要一个标量值的loss。 那…

YOLOv10(2):网络结构及其检测模型代码部分阅读

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据-CSDN博客 目录 1. 写在前面 2. 局部模块 &#xff08;1&#xff09;SCDown &#xff08;2&#xff09;C2fCIB &#xff08;3&#xff09;PSA(partial self-attention) 3. 代码解读 &#x…

手把手教大家如何使用Kaggle平台的免费GPU资源跑深度学习模型

如果手头没有GPU资源是没法很好进行学习和实操各种深度学习模型的&#xff0c;所幸有一些平台提供了GPU资源供广大兴趣爱好者进行免费使用。 一、免费GPU资源的平台 1. Google Colab 地址&#xff1a;https://colab.research.google.com/ 简介&#xff1a;Google Colab&…

ssm_mysql_高校自习室预约系统(源码)

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

思科防火墙配置内网地址 配置PAT 思科防火墙还是不能访问外网?

环境: 思科设备 frp2100 问题描述: 思科防火墙配置内网地址 配置PAT 思科防火墙还是不能访问外网? 解决方案: 要配置思科ASA防火墙以便内网用户可以访问外网,通常会使用PAT(端口地址转换),这里是一个基本的配置流程示例。请注意,以下步骤假定你已具备必要的网络知…

kubernetes之etcd基本操作

etcd常用操作 拷贝etcd命令行工具查看etcd集群节点查看etcd集群监控状态查看etcd集群节点状态查看etcd集群内的所有key查看etcd集群内对应key的valueetcd备份etcd恢复 拷贝etcd命令行工具 rootmaster2:~# find / -iname "etcdctl" /var/lib/docker/overlay2/70f2d53…

在mongodb5.0.11版本中创建用户和授权

目录 处理原因&#xff1a; 1、设定mongodb的环境变量 2、登录mongodb 3、使用admin库 4、创建 mongouser用户 5、更新 mongouser 可使用的库 6、创建 mongouser角色授权 7、更新root账号也可以使用 mongouser角色 处理原因&#xff1a; 在MongoDB中&#xff0c;root角…

throw和throws的区别是什么?

在Java编程语言中&#xff0c;throw和throws都是与异常处理相关的关键字&#xff0c;但它们在使用方式和作用上有着明显的区别。下面将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细解释它们之间的区别。 一、技术难点 throw&#xff1a;throw关键字用于在程…

IDEA中,MybatisPlus整合Spring项目的基础用法

一、本文涉及的知识点【重点】 IDEA中使用MybatisPlus生成代码&#xff0c;并使用。 Spring整合了Mybatis框架后&#xff0c;开发变得方便了很多&#xff0c;然而&#xff0c;Mapper、Service和XML文件&#xff0c;在Spring开发中常常会重复地使用&#xff0c;每一次的创建、修…

关键主题汇编

用户使用双屏扩展桌面类软件时,所遇到的主要疑难问题汇编 https://exesoft.blog.csdn.net/article/details/43116867 知识竞赛现场管理系统安装配置及使用疑难问题汇编 https://exesoft.blog.csdn.net/article/details/53457491 关于知识竞赛现场管理系统内置的第三方答题平…

【杂记-浅谈XSS跨站脚本攻击】

一、什么是XSS&#xff1f; XSS&#xff0c;Cross-site Scripting&#xff0c;跨站脚本攻击&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;攻击者利用Web程序对用户输入检查不足的漏洞将可执行恶意脚本注入网站或Web应用&#xff0c;当用户访问网页时触发恶意脚本的…

App Web前端怎么开发:深入解析与开发实践

App Web前端怎么开发&#xff1a;深入解析与开发实践 在当今数字化时代&#xff0c;Web前端作为连接用户与应用程序的桥梁&#xff0c;其重要性不言而喻。对于想要涉足App Web前端开发的开发者而言&#xff0c;理解并掌握开发流程、技术栈以及最佳实践是至关重要的。本文将分四…

milvus向量数据库

Milvus 是一个开源的向量数据库&#xff0c;用于管理、搜索和分析高维向量数据。它特别适用于处理像图像、视频、音频和文本等非结构化数据。以下是关于 Milvus 向量数据库的详细介绍和入门教程。 ### Milvus 简介 Milvus 的主要特性包括&#xff1a; 1. **高性能**&#xf…