オブジェクトプール(デザインパターン)

OYPosted by

先日、某ミドルウェアのドライバライブラリのデバッグ中にライブラリの中身を確認してみたらこのパターンを用いていたので。ついでに軽く自前で実装してみようかなと。

このパターンを利用する場合、

・あるオブジェクトの生成コストが高い
・また、複数同時に参照させたくない(アンスレッドセーフ)

上記のような状況で、オブジェクトの生成を極力避けつつ、安全性を担保することが目的となります。

まあ簡単に説明すると、プールからオブジェクトを借りたり、返したり、空きがなければ許容された範囲で生成したりするだけです。

Javaではorg.apache.commonsによって提供されるGenericObjectPool、PooledObject、ObjectPoolFactoryなどを利用することによって結構リッチなのが実装できるようになっています。

以下がソースです(インターフェースによって実装しなくてはならないメソッドが多すぎるので邪魔な部分は省略しています)

ーーーーーーーーーーーーーーー
実行結果
ーーーーーーーーーーーーーーー
@@@@ start @@@@ 1536419665512
number = 1 , time = 1536419667519
number = 1 , time = 1536419667523
number = 2 , time = 1536419669527
ーーーーーーーーーーーーーーー

1回目と3回目ではプール内に借りれるオブジェクトがまだ存在せず、新しく生成しなくてはならないため、2秒ちょいかかっています。2回目に使用されたオブジェクトはプールから借りているため、使用に至るまでに4ミリ秒しかかかっていません。

また、今回は特に設定していませんが、待機状態にできるオブジェクト、最大で動かせるオブジェクトの数などはGenericObjectPoolConfigで設定を与えることが可能です。
※この設定は用途や実行環境のリソースに応じてしっかりチューニングする必要があります

 

以上

 

 

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA