很多时候,要创建一个资源类对象,或者是一个大的应用数据对象,所花费的开销都是巨大的. 比如要建立一个连接,要根对方获得握手协定等等. 像这些花销巨大的对象,保存来做成全局不行,因为当前只能供给一个线成使用,那就只能池化了
池化的对象特点是:对象一次只能供给一个线成使用.但又必须尽量保存,以避免巨大的构建开销.
/**Resources是一个将要被池化的对象的接口,有一个被动撤消的close方法(为符合一般性资源类要求)
*/
interface Resources{
void close(){};
}
//真正的资源类
class ConcreteResources implements Resources{
void close(){
//销毁内部相关资源eg: ...=null;
}
}
/**资源对象池
*/
class ResourcesPool implements Resources{
private List resL = null;
private int CACHE_MAX_SIZE = 10;
public synchronized Resources getResources(){
if(resL == null)
resL = new ArrayList();
if(resL.isEmpty){
Resources res = new DecResources();
return res;
}else{
int last= resL.size()-1;
Resources res = resL.get(last);
resL.remove(last);
return res;
}
}
public synchronized void release(Resources res){
if(resL.size>CACHE_MAX_SIZE){
res.getReources.close();
}else{
resL.add(res);
}
}
public synchronized void addResources throws Exception(Resources res){
if(res instanceof DecResources){
release(res);
}else(throw new Exception("添加资源类型错误"))
}
}
/**为封闭掉close采用Decortor模式*/
class DecResources extends ResourcesPool implements Resources{
private Resources res= new ConcreteResources();
public void close(){
release(this);
}
//为直接关闭提供出res
public Resources getResources(){
return res;
}
}
/**使用:
如果需要获得对象,只需要
ResourcesPool pool = new ResourcesPool();
pool.add(new ...);
Resources res = pool.getResources();
使用.....
res.close();
*/
这是个简单的模型, close是针对大量资源类都提供的方法, 并不一定需要,自己的对象不要最好.逻辑看起来挺麻烦的.
同样,由于使用的是公共非栈对象,给出了syn,,如果使用频繁,类似cache,就使用rw
rw使用方式如下:
ReadWriteLock rw = ReentrantReadWriteLock();
Lock r = rw.readLock();
Lock w = rw.writeLock();
在类中需要读的方法段
r.lock();
...
r.unlock();
在类中需要写的方法段
w.lock();
...
w.unlock();
好多东西都忘记了,要查api,刚好复习下 呵呵
再次说明,这只是例子,编码是随心所欲的..