关于对象池技术的一些记录
线程池和数据库连接池是比较常见的对象池的实现,之所以想起来写这个东西,是因为,在看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的默认实现应该已经能够满足我们的要求了