问大家如何设计对象池?

如何设计让对象在内存中快速存取!

如果有人熟悉apache.org的commons中的objectpool也可以谈谈心得!

很简单啊,自己弄一个Vector,循环引用就可以了吧?

我也想知道,能不能详细点,比如不仅仅是进出的问题吧,关于对象集合从对象池的选取问题,如何检查对象集合的大小,对这个还很不懂啊

我在自己写的聊天室中设计的通用Pool基类,线程池、连接池、对象池等只要集成这个基类,并实现其
protected abstract Object creat();
protected abstract void close(Object obj);
方法即可。小弟我乃java初学者,程序虽然能用,但可能写得很幼稚,还请各位高手指教一下。

get()从池中获取对象
free()把对象还回池中
clear()清洗池
getObjectCount()获取池中存在的对象数目
getActiveObjectCount()获取目前在池外工作的对象数目
elements()获取池中所有对象的数组


package huzq.Pools;

import java.util.*;

public abstract class Pool{
private Vector buffer;

private int objectCount;
private int maxObject;

public Pool(int maxObject){
this.maxObject = maxObject;
objectCount = 0;
buffer = new Vector(maxObject);
}

protected abstract Object creat();
protected abstract void close(Object obj);

private Object _get(){
Object obj = null;
if (buffer.isEmpty()){
if (objectCount < maxObject){
obj = creat();
objectCount++;
}
}else{
obj = buffer.elementAt(0);
buffer.removeElementAt(0);
}
return obj;
}

public Object get(){
Object obj = _get();

synchronized(this){
while(obj == null){
Thread.yield();
try{wait();}catch(Exception e){}
obj = _get();
}
notifyAll();
}
return obj;
}

public synchronized void free(Object obj){
buffer.addElement(obj);
notifyAll();
}

public synchronized void setMaxSize(int maxSize){
clear();
this.maxObject = maxSize;
buffer.setSize(maxSize);
}

public int getObjectCount(){
return objectCount;
}

public int getActiveObjectCount(){
return objectCount - buffer.size();
}

public synchronized void clear(){
if (buffer.isEmpty())
return;

while(getActiveObjectCount() > 0){
Thread.yield();
try{wait();}catch(Exception e){}
}

Object[] e = elements();
for(int i=0; i<e.length; i++)
close(e);

buffer.removeAllElements();
objectCount = 0;
notifyAll();
}

public synchronized Object[] elements(){
if (buffer.isEmpty()){
return null;
}

while(getActiveObjectCount() > 0){
Thread.yield();
try{wait();}catch(Exception e){}
}

Object[] o = new Object[objectCount];

Enumeration e = buffer.elements();
int i = 0;
while(e.hasMoreElements()){
o = e.nextElement();
i++;
}

return o;
}
}

中家 代码不错,线程编码难度很高,还是建议使用Jakarta的Common包中的池


请教:
做完这个对象池,如何让其保存在内存中多用户共享??

可以多用户,注意同步就可以

> 请教:
> 做完这个对象池,如何让其保存在内存中多用户共享??

使用静态的对象,但是要注意安全,或者使用ThreadLocal

使用ThreadLocal是个好主意,好像用这个的人不多。