关于对象池技术的一些记录
线程池和数据库连接池是比较常见的对象池的实现,之所以想起来写这个东西,是因为,在看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的默认实现应该已经能够满足我们的要求了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现