资源泄漏:救援的命令模式

多年来, 使用Plumbr进行性能监视时,我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题。

首先,我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在播放电影本身。 按照当今的习惯,我们不想将整个电影收藏存储在用于播放电影的设备上。 相反,我们将电影下载到本地临时文件中,然后播放并删除该文件以释放下一部电影的空间。 这种工作流程的简单实施如下所示:

public class MoviePlayer {private final Catalog catalog = new Catalog();public void play(String movieName, String screen) {Movie movie = catalog.find(movieName);try {movie.fetch();movie.play(screen);} finally {movie.release();}}
}class Catalog {Movie find(String name) {return new Movie(name);}
}

如您所见, MoviePlayer类是Catalog类的客户端,必须照顾电影播放的整个生命周期。 查找,下载,播放和删除文件均属于MoviePlayer类的实现。

这是第一个问题:如果至少一个这样的客户端是由某个粗心的开发人员编写的,他们忘记调用movie.release()方法,则下载的文件将保留在本地磁盘上。 因此,您播放的每部电影都将添加一个文件,并且设备上的磁盘空间最终将被耗尽。

引入其他功能后,就会暴露出这种“万事通”代码的第二个问题。 例如,假设您需要增加记录实际电影播放时间的可能性。

当前唯一的方法是更改MoviePlayer类。 如果Catalog类有其他客户,则每个客户都需要引入更改。 结果, MoviePlayer的每个附加功能都变得越来越大,处理越来越多的独立问题。 结果,代码最终将难以理解和更改。

考虑到MoviePlayer应该主要只是处理电影的播放,所以听起来确实有太多额外的麻烦。 确实,因此让我们尝试将所有这些混乱的内容从MoviePlayer中移出,以确保我们拥有一个负责任的班级。 命令设计模式是20年的技术,最适合手头的任务。

减轻痛苦:救援的命令模式

Java命令模式中的模式
该方法背后的基本思想是首先抽象出因使用案例而异的操作,以使其与算法中更稳定的部分区分开。 在我们的情况下,这可能涉及电影播放或使用不同的视频编解码器进行重新编码。 因此,包括“查找电影-下载-执行某些操作-删除本地文件”的乏味步骤的样板将与特定用例隔离。 在我们的示例中,我们可以使用以下简单界面执行此操作:

interface MovieCommand {void execute(Movie movie);
}

上面的更改包括引入一种带有MovieAction类型的附加参数的新方法。 在此方法中,将执行整个算法:

  • 电影已找到。
  • 电影已下载。
  • 传递给该方法的动作或命令在影片上执行。 现在,特定操作是随用例而变化的唯一可变部分。
  • 最后,释放电影的文件句柄并执行对临时文件的清理。

现在,如果需要以任何方式更改算法,我们将只在一个地方进行操作,而不会影响仍仅关注其特定动作(例如电影播放或编码)的任何客户端。 现在,我们的MoviePlayer示例非常简单:

class Catalog {private Movie find(String name) {return new Movie(name);}void withMovie(String movieName, MovieCommand action) {Movie movie = find(movieName);try {movie.fetch();action.execute(movie);} finally {movie.release();}}
}

该技术非常强大且广泛。 如果您尚未意识到此用途,请考虑对关系数据库的JDBC访问。 所有与获取数据库连接,准备语句,获取结果集以及关闭资源有关的样板文件,特别是在Spring Templating进行救援之前,都是噩梦般的处理顺序。

同样,可以通过使用命令模式,从不必要的样板中清除代码并大大简化代码库,在自定义代码库中实现不同方面,例如安全检查或缓存。

翻译自: https://www.javacodegeeks.com/2016/09/resource-leakages-command-pattern-rescue.html

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

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

相关文章

Word文字的三种隐藏方法

在Word的使用过程中,有时候可能需要这么一种情况:一些文字或者段落我们暂时不需要,但又不知后期是否用到,其碍眼却又不能删除。这个时候,最好的方法就是暂时隐藏文字或者段落。今天寻老师教大家三种隐藏Word文本的方法…

Video 对象方法 canPlayType()

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>我的浏览器可以播放 MP4 视频吗?<span> <button οnclick"supportType(e…

Linux下区分物理CPU、逻辑CPU和CPU核数

㈠ 概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量&#xff0c;可以数不重复的 physical id 有几个 ② 逻辑CPU Linux用户对 /proc/cpu…

java原子更新类_Java内部具有原子更新的动态热交换环境

java原子更新类有人可能会争辩说上述标题可以简称为OSGi &#xff0c;我想在一开始就放弃这种思考过程。 对于OSGi而言&#xff0c;这没有什么冒犯的&#xff0c;它是一个很棒的规范&#xff0c;在实现层或可用性层上都搞砸了&#xff0c;这就是我对OSGi的信念。 当然&#xf…

5个构建Spring Boot API的实用技巧

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 每个API开发人员都在寻找一种更安全…

C++项目目录组织结构

项目目录结构的问题基本上是个仁者见仁&#xff0c;智者见智的问题&#xff0c;只要自己用着顺手&#xff0c;使用什么样的目录组织结构是没有什么大碍的。当然如果项目很大&#xff0c;参与的人员很多&#xff0c;那么合理的组织一下目录结构还是会有很大的益处的。不同类型的…

火绒杀毒软件更安静

https://www.huorong.cn/转载于:https://www.cnblogs.com/Tom-yi/p/10554564.html

完全编译安装boost

文章目录 1. 安装依赖2. 编译安装 boost3. 环境变量配置 boost是C世界中相当优秀的第三方库&#xff0c;被选入STL的也有不少&#xff0c;其中用到的C奇技淫巧更是数不胜数。 安装依赖 boost 在类 Unix 系统上的安装&#xff0c;可以参考官方文档的 Get Started&#xff0c;除此…

c#Md5 32位加密结果少了两个0的原因

我们的&#xff1a; e1adc3949ba59abbe56e57f20f883e 第三方的&#xff1a;e10adc3949ba59abbe56e057f20f883e 原因: 这个是很常见的错误&#xff0c;你字节转换成字符串的时候要保证是2位宽度啊&#xff0c;某个字节为0转换成字符串的时候必须是00的&#xff0c;否则就会丢失…

lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数

lambdas for这些天来&#xff0c;我发布了Wordcounter &#xff0c;这是一个Java库和命令行实用程序&#xff0c;用于对文本文件中的单词进行计数并对单词计数进行分析&#xff0c;从而大量使用了功能编程结构和并行计算方法。 这是我在“令人讨厌的快速问答”大赛第四个条目SA…

Bitmap Font生成

工具&#xff1a;AngelCode 的 Bitmap Font Generator。把需要用到的文字写到一个txt&#xff0c;注意编码为Unicode。接着&#xff0c;在工具里 Edit->select chars from file选择刚才新建的txt文件。然后。。。之后的没啥细节&#xff0c;随意搞吧。转载于:https://www.cn…

分隔和截断字符串, boost string algorithm library中的split和trim

http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html 这个库是个 headers only library  这个库提供了STL没有提供的 string-related算法, 但是实现做到了可以用在任何 character 的 container上 split 在写在线状态的改造时候要把一个字符串中描述的几种类型拆…

使用Spring Integration重试RabbitMQ

我最近阅读了有关使用RabbitMQ重试的方法 在这里&#xff0c;并想尝试类似的方法 Spring Integration &#xff0c;提供了一组很棒的集成抽象。 TL; DR解决的问题是重试一次消息&#xff08;在处理失败的情况下&#xff09;&#xff0c;两次重试之间有较大的延迟&#xff08…

Vue_(Router路由)-vue-router路由的基本用法

vue-router官网&#xff1a;传送门 vue-router起步&#xff1a;传送门 vue-router路由&#xff1a;Vue.js官网推出的路由管理器&#xff0c;方便的构建单页应用 单页应用&#xff1a;Single Page Application简称SPA&#xff0c;只有一个web页面的应用&#xff0c;用户与应用交…

利用boost做string到wstring转换,以及字符集转换

#include <boost/locale.hpp> int _tmain(int argc, _TCHAR* argv[]) {//std::locale::global(std::locale("utf-8"));std::locale::global(std::locale("")); // 设置全局的C运行库locale 可以针对cout fstream等单独设置 空表示默认使用当前系统…

P4198 楼房重建

[Luogu4198] 原题解 19.3.21 用线段树维护有关单调栈的问题 不要pushdown , 但是pushup的时候需要特别注意. 19.3.31 这里的\(pushup2\)其实就是几个特判 : 没有 , 直接返回当前区间答案 , 区间长度为\(1\) , 以及剩下两大类 , 这里有一个模板 : if(mx[ls]<tmp) return push…

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列/指令序列”; 一切进程至少有一个执行线程; 进程 VS. 线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调…

蓝桥杯 密文搜索(全排列)

题目描述福尔摩斯从X星收到一份资料&#xff0c;全部是小写字母组成。他的助手提供了另一份资料&#xff1a;许多长度为8的密码列表。福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏密码的位置。…

openshift_为Openshift + MongoDb应用程序编写验收测试

openshift验收测试用于确定是否满足规范要求。 它应在与生产环境尽可能相似的环境中运行。 因此&#xff0c;如果您的应用程序已部署到Openshift中&#xff0c;则您将需要一个与生产环境中使用的帐户平行的帐户&#xff0c;以运行测试。 在这篇文章中&#xff0c;我们将为部署到…

学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一、无条件跳转: JMP;二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转JZ ;为 0 则跳转 JNZ ;不为 0 则跳转JS…