资源对象的池化, java极简实现,close资源时,自动回收
在java程序中对于资源,例如数据库连接,这类不能并行共享的资源对象,一般采用资源池的方式进行管理。
资源池一般要实现 1)获取资源对象 getObject(): 从资源池中取出对象
2) returnObject() : 资源用完以后,将资源放回对象池
3) 资源对象(代理)调用close()方法时, 资源返回对象池。 对于有close方法的资源,一般是采用此方式。
以下是一个非常简单的资源对象池的实现

public class SimplePool<T> {
// 回收资源的方法名
private String closemethod = "close";private LinkedBlockingQueue<T> sources = new LinkedBlockingQueue<T>();
private List<T> origins = new ArrayList<T>();
public SimplePool(){
} public T getSource() throws InterruptedException {
return this.sources.take();
} /**
* 将资源加入到池中, 并为资源对象生成代理对象,放到队列中。
* @param t
*/
public synchronized void addSource(T t) {
origins.add(t);
Handler handler = new Handler(t);
T pt = (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), handler);
sources.offer(pt);
} /**
* Java 动态代理实现的InvocationHandler, 代理对象调用close方法时,
* 将资源带来对象放回到队列中,从而实现资源自动回收
*/
class Handler implements InvocationHandler {
Handler(T t) {
target = t;
}
T target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equalsIgnoreCase(SimplePool.this.closemethod)) {
SimplePool.this.sources.put((T) proxy);
return null;
}
return method.invoke(target, args);
}
} /**
* 获取可用资源数量
* @return
*/
public int count() {
return sources.size();
} /**
* 获取已放入池中的资源数量
* @return
*/
public int size(){
return this.origins.size();
}
}

这个资源池的代码非常简单, 当然,还可以在代码中增加 ObjectFactory<T> 的工厂对象,在getSource方法中,但资源不足时,就可以调用这ObjectFactory<T>生成新的资源对象。另外,像connection对象可能还需要进行可用性检测等。
资源对象的池化, java极简实现,close资源时,自动回收的更多相关文章
- java——极简handler机制
handler机制要做的事情: 1.把一堆从四面八方传来的message加到一个队列中,这个队列就是MessageQueue. 2.将MessageQueue中的队头Message取出,并使用这个me ...
- 对象池化技术 org.apache.commons.pool
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 将长生命周期对象和大对象池化
将长生命周期对象和大对象池化 请记住最开始说的原则:对象要么立即回收要么一直存在.它们要么在0代被回收,要么在2代里一直存在.有些对象本质是静态的,生命周期从它们被创建开始,到程序停止才会结束.其它对 ...
- 池化 - Apache Commons Pool
对于那些创建耗时较长,或者资源占用较多的对象,比如网络连接,线程之类的资源,通常使用池化来管理这些对象,从而达到提高性能的目的.比如数据库连接池(c3p0, dbcp), java的线程池 Execu ...
- 《Mybatis 手撸专栏》第6章:数据源池化技术实现
作者:小傅哥 博客:https://bugstack.cn - 手写Mybatis系列文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 码农,只会做不会说? 你有发现吗,其实很大一部分码农 ...
- Java--对象池化技术 org.apache.commons.pool2.ObjectPool
org.apache.commons.pool2.ObjectPool提供了对象池,开发的小伙伴们可以直接使用来构建一个对象池 使用该对象池具有两个简单的步骤: 1.创建对象工厂,org.apache ...
- 使用ArrayPool池化大型数组(翻译)
原文链接:https://adamsitnik.com/Array-Pool/ 使用ArrayPool 简介 .NET的垃圾收集器(GC)实现了许多性能优化,其中之一就是,设定年轻的对象很快消亡,然而 ...
- [DeeplearningAI笔记]卷积神经网络1.9-1.11池化层/卷积神经网络示例/优点
4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9池化层 优点 池化层可以缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性. 池化层操作 池化操作与卷积操作类似 ...
- 池化技术之Java线程池
https://blog.csdn.net/jcj_2012/article/details/84906657 作用 线程池,通过复用线程来提升性能; 背景 线程是一个操作系统概念.操作系统负责这个 ...
随机推荐
- LeetCode 934. Shortest Bridge
原题链接在这里:https://leetcode.com/problems/shortest-bridge/ 题目: In a given 2D binary array A, there are t ...
- 【JZOJ6230】【20190625】梦批糼
题目 一个$n\times m \times l $的立方体,有一些位置有障碍 一次操作会随机选择一个立方体,共有\(w\)次操作 询问所有操作都不选到障碍点,被选到至少一次的点的期望 $n ,m,l ...
- mac 下使用Charles抓包华为手机app
安装Charles:https://www.cnblogs.com/sea-stream/p/11577418.html 需要保证手机与电脑连接同一个Wi-Fi设置mac charles,打开代理 2 ...
- HTML引入外部JS文件
<!--引入外部文件的方式--> <script type="text/javascript" src="attack.js">< ...
- lastal
http://last.cbrc.jp/doc/lastal.html This program finds local alignments between query sequences, and ...
- Fluent设置充分发展湍流入口(利用profile)
计算模型: 物性参数为: 密度:100kg/m3 粘度系数:0.003333kg/(m·s) 原视频下载地址: https://pan.baidu.com/s/1W3n_K-dZCVMF7M63wV2 ...
- ansible-playbook-批量修改主机名
修改cat /etc/ansible/hosts [test]10.27.235.108 host_name=test_host_name - hosts: test user: root gathe ...
- DNS技术和NAT技术详解
DNS技术和NAT技术详解一.DNS(Domain Name System)1.什么是DNS2. 了解域名3.域名解析过程4.使用dig工具分析DNS过程5.浏览器输入URL后发生什么事?二.ICMP ...
- DesktopSharing<转>
https://github.com/PHZ76/DesktopSharing/tree/e1543975576e6c4fc5c2404b2f4c9c99c0350bd3 git:https://gi ...
- NioEventLoopGroup源码分析与线程设定
我的以Netty Socket编程的代码为例, 1.EventLoopGroup 进入EventLoopGroup,这是一个特殊的EventExecutorGroup,在事件循环中,在selectio ...