JAvaオブジェクトプール

18501 ワード

まず、オブジェクトプールについて説明します.オブジェクトプールとは、オブジェクトの一部を1つのプールに格納することです.必要に応じて取り、必要に応じて解放します.実は、オブジェクトプールでは2つのSparseArrayが維持されています.
では、オブジェクトプールは何の役に立つのでしょうか.もちろん役に立ちます.メッセージ処理のとき、例えばチャットソフトウェアでメッセージが作成され、破棄されると、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);