commons-pool对象池相关分析

妖精的绣舞 提交于 2019-12-17 20:43:23

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

源代码下载

官网

Git 下载:

$ git clone https://git-wip-us.apache.org/repos/asf/commons-pool.git

源码包下载src.zip

核心的类及关系如下图:

ObjectPool

ObjectPool是对象池的接口,定义了非常简单的接口,仅仅需要通过addObject添加对象borrowObject可以获取对象,returnObject归还对象,invalidateObject让对象失效。 实例如下:

public class ObjectPoolTest {
    public static void main(String[] args) throws Exception {
        ObjectPool  pool = new GenericObjectPool();
        PoolableObjectFactory factory = new PoolableObjectFactory() {
            @Override
            public Object makeObject() throws Exception {
                return new Object();
            }

            @Override
            public void destroyObject(Object obj) throws Exception {

            }

            @Override
            public boolean validateObject(Object obj) {
                return false;
            }

            @Override
            public void activateObject(Object obj) throws Exception {

            }

            @Override
            public void passivateObject(Object obj) throws Exception {

            }
        };
        pool.setFactory(factory);
        pool.addObject();
        Object obj = null;

        try {
            obj = pool.borrowObject();
            //...use the object...
        } catch(Exception e) {
            // invalidate the object
            pool.invalidateObject(obj);
            // do not return the object to the pool twice
            obj = null;
        } finally {
            // make sure the object is returned to the pool
            if(null != obj) {
                pool.returnObject(obj);
            }
        }

    }
}

对象池的一般操作

上面的实例大致可以看到对象池的使用方法,就是初始化池、往池中放入对象、从池中取对象、归还对象和销毁对象几个操作。下面就通用的GenericObjectPool为例分析一下相关的操作

GenericObjectPool相关数据结构

Config

Config是GenericObjectPool的简单内部类,其打包了GenericObjectPool的基本配置,详细说明及默认值可以参见源码。

Latch

Latch用来控制对象到线程的分配顺序,以确保公平性。也就是说,对象按线程请求对象的顺序分配给线程。

构造与初始化

GenericObjectPool将对象的make过程委托给PoolableObjectFactory工厂去做了,其所有构造方法中都有PoolableObjectFactory这个接口,也就是说如果想要实例化GenericObjectPool需要传入PoolableObjectFactory的实现

addObject()方法

如上所述,addObject()方法如果在PoolableObjectFactory的实现为空时会抛出异常:

  if (_factory == null) {
            throw new IllegalStateException("Cannot add objects without a factory.");
        }

addObject()方法会调用PoolableObjectFactory实现类的makeObject()方法,并调用addObjectToPool()方法将对象放入对象池。

borrowObject()方法

当池中有了对象之后,就可以取到了,如果没有会抛出异常

returnObject()方法

将对象放回池中

invalidateObject()方法

将对象destroy

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!