资源对象的池化, 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对象可能还需要进行可用性检测等。

原文地址:https://www.cnblogs.com/piepie/p/10498953.html

时间: 2024-08-30 11:09:48

资源对象的池化, java极简实现,close资源时,自动回收的相关文章

池化技术——自定义线程池

目录 池化技术--自定义线程池 1.为什么要使用线程池? 1.1.池化技术的特点: 1.2.线程池的好处: 1.3.如何自定义一个线程池 2.三大方法 2.1.单个线程的线程池方法 2.2.固定的线程池的大小的方法 2.3.可伸缩的线程池的方法 2.4.完整的测试代码为: 3.为什么要自定义线程池?三大方法创建线程池的弊端分析 4.七大参数 5.如何手动的去创建一个线程池 6.四种拒绝策略 6.1.会抛出异常的拒绝策略 6.2.哪来的去哪里拒绝策略 6.3.丢掉任务拒绝策略 6.4.尝试竞争拒绝

到底什么是极简主义?

“现在特别流行极简主义设计”,那么,到底什么是极简主义?极简主义不光存在于网页设计中,像Logo设计.印刷设计.包装设计也都有相应的极简主义风格.目前流行的极简主义网页设计视觉风格是:使用纯粹的色彩以及简练唯美的照片. 极简主义网页设计流行使用创新式导航,不但易用,而且有种简约美,符合极简主义“回归功能”与“视觉简约”的双重理念.简约的外观.易用的功能,并不意味着极简主义网页设计很简单.事实上,优秀的极简风格作品需要复杂的设计流程. 有一种不错的极简主义设计方法是:先设计一个风格复杂的网页,然后

Java 数据持久化系列之池化技术

在上一篇文章<Java 数据持久化系列之JDBC>中,我们了解到使用 JDBC 创建 Connection 可以执行对应的SQL,但是创建 Connection 会消耗很多资源,所以 Java 持久化框架中往往不直接使用 JDBC,而是在其上建立数据库连接池层. 今天我们就先来了解一下池化技术的必要性.原理:然后使用 Apache-common-Pool2实现一个简单的数据库连接池:接着通过实验,对比简单连接池.HikariCP.Druid 等数据库连接池的性能数据,分析实现高性能数据库连接池

Java 线程第三版 第五章 极简同步技巧 读书笔记

一.能避免同步吗? 取得锁会因为以下原因导致成本很高: 取得由竞争的锁需要在虚拟机的层面上运行更多的程序代码. 要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 计算机有一定数量的主寄存器用来存储与程序有关的数据. 从逻辑上的观点来看,每个Thread都有自己的一组寄存器.当操作系统将某个Thread分配给CPU时,它会把该Thread特有的信息加载到CPU的寄存器中.在分配不同的Thread给CPU之前,它会将寄存器的信息存下来.所以Thread间绝不会共享保存在寄存器的数据.

Java对象表示方式2:XStream实现对对象的XML化

上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 2.多语言环境下,使用Java序列化方式进行存储后,很难用其他语言还原出结果 3.占用的字节数比较大,而且序列化.反序列化效率也不高 前面也提到过,对象表示有各种各样的方式,序列化只是其中的一种而已.表示一个对象的目的无非就是为了对象<---->IO之 间相互认识,至于怎么认识,那就有很多选择了

极简容器化交付 | 0命令行完成镜像上传

虽然docker.kubernetes的命令集并非十分复杂,后台操作也比较快捷,但是对于大多数徘徊在容器化门口的企业和个人用户来说,仍旧是一块心病,docker or not docker, that's a question,SWR服务通过提供界面化的操作,屏蔽原生命令行,简化用户操作和技术门槛,为企业和个人用户提供极简的容器化交付平台,我们接下来会通过一系列的文章,向大家介绍SWR的这些功能特性. 今天要为大家介绍的是用户0命令行,通过WEB界面实现镜像的上传及实现原理剖析. 我们从这个最为

极简极棒C语言环境搭建(win, 使用Clion)为Jetbrains全家桶之一相对于java的IDEA-1

首先电脑不能太卡: 推荐i5+8G内存+SSD 然后先把MINGW64文件准备好: 参考链接: Window10上CLion极简配置教程 https://www.jianshu.com/p/1aa989808e15 这里我选择了先安装Dev-Cpp, 然后它根目录下有MinGW64, 准备好MinGW64后, 无脑安装Clion, 安装中配置clion的安装位置略过不表, 然后参考上面的教程连接配置clion的MinGW64, 最后一步激活clion, 推荐使用正版 原文地址:https://w

Resty 一款极简的restful轻量级的web框架

https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规范不具有实际意义,推荐一篇osc两年前的文章:RESTful API 设计最佳实践 和 Infoq的一篇极其理论的文章 理解本真的REST架构风格 虽然有点老,介绍的也很简单,大家权当了解,restful的更多好处,还请google 拥有jfinal/activejdbc一样的activerecor

线程池;java实现线程池原理

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程完成后才启动. 组成部分 1.线程池