关于对象池技术的一些记录
线程池和数据库连接池是比较常见的对象池的实现,之所以想起来写这个东西,是因为,在看Java编程思想的时候,看到是使用信号量来实现的一个通用的简单的对象池的实现,之后,又看了apache的commons-pool的实现,所以记录一下实现一个对象池,就需要主要哪一些东西.

Java编程思想中提供的一种基于信号量的简单的对象池,代码如下:

package com.jiaoyiping.baseproject.pool;

import com.jiaoyiping.baseproject.thrift.Hello;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;

/**
 * Created with Intellij IDEA
 *
 * @author: jiaoyiping
 * Mail: jiaoyiping@gmail.com
 * Date: 2018/04/01
 * Time: 21:04
 * To change this template use File | Settings | Editor | File and Code Templates
 */
//Java编程思想中的线程池的实现
public class ThinkingInJavaPool<T> {
    private Semaphore semaphore;
    private int size;
    private boolean[] marks;
    private List<T> data = new ArrayList<>();

    public ThinkingInJavaPool(int size, Class<T> dataType) {
        this.size = size;
        this.semaphore = new Semaphore(size);
        marks = new boolean[size];
        for (int i = 0; i < size; i++) {
            try {
                data.add((T) dataType.newInstance());
                marks[i] = false;
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    public T get() {
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (marks) {
            for (int i = 0; i < size; i++) {
                if (marks[i] == false) {
                    marks[i] = true;
                    return data.get(i);
                }

            }

        }
        //this will never happen
        return null;
    }

    public void release(T t) {
        synchronized (marks) {
            int index = data.indexOf(t);
            if (marks[index] == true) {
                marks[index] = false;
            }
        }
        semaphore.release();
    }
}    

另外一种通用的并发的对象池的实现,参考文章:
http://ifeve.com/generic-concurrent-object-pool/
Apache中的commons-pool项目的对象池实现的一些思路(项目的地址参考这里https://commons.apache.org/proper/commons-pool/):
1.使用工厂方法来进行对象的初始化(通常一个通用的对象池的实现,都需要考虑对象的创建的问题)
2.使用了通用的对象池的实现和key-value的对象池的实现
3.可以自己定义对象池中的对象的配置(最大最小数值,和空闲时间等等)和对象的淘汰的策略
4.可以选择自己实现commons-pool提供的接口,来实现自己的对象池
5.使用commons-pool的默认实现应该已经能够满足我们的要求了

posted on 2018-04-01 21:43  梦中彩虹  阅读(205)  评论(0编辑  收藏  举报