JAvaオブジェクトプール
まず、オブジェクトプールについて説明します.オブジェクトプールとは、オブジェクトの一部を1つのプールに格納することです.必要に応じて取り、必要に応じて解放します.実は、オブジェクトプールでは2つのSparseArrayが維持されています.
では、オブジェクトプールは何の役に立つのでしょうか.もちろん役に立ちます.メッセージ処理のとき、例えばチャットソフトウェアでメッセージが作成され、破棄されると、GCに大きなプレッシャーをかけます.このとき、オブジェクトプールが使用できるようになります.実は、ここでスレッドプールを連想することができます.
まず、オブジェクトプールObjectPoolを見てみましょう.これは抽象的な方法で、オブジェクトを作成する方法は開発者自身に作成されます.
下の手が叩くことに注意して、複製したのではありませんて、いくつかフォーマットが間違っているかもしれませんて、読者はその中の思想を悟ることに注意します
MyObject
使用
では、オブジェクトプールは何の役に立つのでしょうか.もちろん役に立ちます.メッセージ処理のとき、例えばチャットソフトウェアでメッセージが作成され、破棄されると、GCに大きなプレッシャーをかけます.このとき、オブジェクトプールが使用できるようになります.実は、ここでスレッドプールを連想することができます.
まず、オブジェクトプールObjectPoolを見てみましょう.これは抽象的な方法で、オブジェクトを作成する方法は開発者自身に作成されます.
下の手が叩くことに注意して、複製したのではありませんて、いくつかフォーマットが間違っているかもしれませんて、読者はその中の思想を悟ることに注意します
public abstract class ObjectPool<T>{
// ,
private SparseArray<T> freePool;
// ,
private SparseArray<T> lentPool;
//
private int maxCapacity;
public ObjectPool(int initialCapacity,int maxCapacity){
initialize(initialCapacity);
this.maxCapacity = maxCapacity;
}
public ObjectPoo(int initialCapacity){
//
lentPool = new SparseArray<>();
freePool = new SparseArray<>();
// , SparseArray
for(int i = 0; i<initialCapacity;i++){
freePool.put(i,create())
}
}
/**
*
*/
public T acquire() throws Exception{
T t = null;
// ,
synchronized(freePool){
int freeSize = freePool.size();
for(int i=0;i<freeSize;i++)
{
int key = freePool.keyAt(i);
t = freePool.get(key);
if(t!=null){
// ,
this.lentPool.put(key,t);
this.freePool.remove(key);
return t;
}
}
// , , , , , SparseArray
if(t==null && lentPool.size()+freeSize<maxCapacity){
//
if(lenPool.size()+freeSize == maxCapacity){
' throw new Exception()
}
t = create();
lentPool.put(lentPool,size()+freeSize,t);
}
}
return t;
}
//
public void release(T t){
if(t ==null){
return;
}
int key = lentPool.indexOfValue(t);
// ,
restore(t);
this,freePool.put(key,t);
this,lentPool.remove(key);
}
public ObjectPool(int maxCapacity) {
this(maxCapacity/2,maxCapacity);
}
protected abstract T create();
protected void restore(T t){ };
}
MyObject
public class MyObjectPool extends ObjectPool{
public MyObjectPool(int initialCapacity, int maxCapacity) {
super(initialCapacity, maxCapacity);
}
public MyObjectPool(int maxCapacity) {
super(maxCapacity);
}
//
@Override
protected Object create() {//LRU
return new Object();
}
//
@Override
public void release(Object o) {
super.release(o);
}
}
使用
//
MyObjectPool pool = new MyObjectPool(2,4);
// freePool
Object o1 = pool.acquire();
Object o2 = pool.acquire();
Object o3 = pool.acquire();
Object o4 = pool.acquire();
// 4 4
System.out.println("hb==="+o1.hashCode());
System.out.println("hb==="+o2.hashCode());
pool.release(o1);
pool.release(o2);