手軽に Object Pool したい。
Jakarta Commons Pool をちらっと見てみると、
public interface ObjectPool {
Object borrowObject();
void returnObject(Object borrowed);
}
な感じ。実装クラスのソースコードを見た感じでは、java.util.Stack クラスを使えば同じようにオブジェクトプールを作れるっぽい。
Stack の主要なメソッドは、これ。
public E push(E item);
public synchronized E pop();
Stack って同期処理だいじょうぶ?
pop だけが synchronized メソッドになってる。
JDK付属のソースコードを見たところ、pop メソッド内では peek を呼び出した後に removeElementAt で最後の要素を削除するようになっている。removeElementAt 前に push が呼ばれたらマズいじゃん(((( ;゜Д゜)))ガクガクブルブル。
実は、Stack は java.util.Vector クラスを継承している。
よく見たら、push メソッドでは addElement を呼び出しているだけ。addElement は Vector のメソッド。
public synchronized void addElement(E obj);
addElement は synchronized メソッド。
これなら、push と pop で同期が取れているはず。なので、利用する側では同期を取らなくて良いはず。
// 際限なく増えるタイプのプール例
class Pool{
Stack pool;
Pool(){
this.pool = new Stack();
}
Object borrowObject(){
try{
pool.pop();
}catch(EmptyStackException e){
return new PoolableObject();
}
}
void returnObject(Object borrowed){
pool.push();
}
private static class PoolableObject{
}
}
borrowObject で取り出して、使い終わったら returnObject でプールに返す。
tags: zlashdot Java Java
Posted by NI-Lab. (@nilab)