手軽に 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)