求一个资源管理模块的多线程模式

dengyejing 2010-11-21 08:54:56
小弟最近正在做一个资源管理模块,基本功能如下:
1、所有资源需要用一个容器记住,因为经常要做遍历操作,我现在是用一个双向链表,资源创建时被添到链表中
2、因为系统硬件限制,不可能所有资源都能加载到内存,需要做动态加载和卸载,我现在是用LRU来管理,当前用到的资源节点会移到链表头,如果当前节点还处于卸载状态,就加载它,然后计算当前已加载资源总体积,如果超过指定值就开始从链表尾回收,一个一个卸载,直接到总体积小于指定值

现在,想把这个模块做成多线程的,主要目的是希望能预先异步加载资源,因为上面第2步中提到的“如果当前节点还处于卸载状态,就加载它”可能很慢,导致停顿。

但是,想了半天,却觉得这里面有个深刻的冲突:即原来的做法是“惰性加载”,与多线程带来的“异步加载”(也就是预加载——提前加载),本质上是矛盾的?
从实现上说,双向链表的所有操作应该加锁,资源的创建、移动操作就安全了,但是,资源的加载和回收这两个操作,我感到很麻烦,如果把它放在锁里,那么只要一个线程在加载,另一个线程就不可能使用资源了(这是使用大粒度锁的时候,但如果对每个资源一把锁,也有问题,因为在加载时不是仅仅只对自己有改动,如果触发了回收,那就会去修改其它资源),如果不放在锁里,那么很可能一个线程在回收时,恰好把另一个线程刚加载到一半的资源又卸载了,另外,要保持当前资源总体积计数的准确性,也有困难

请各位并发高手帮忙想想,怎样的多线程模式适合于这个需求?
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanghehong 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pumanchawulaowu 的回复:]

资源管理还是比较复杂的,有:对象池,缓存,延迟加载,生命周期管理,释放,监控等。你可以参考资源管理模式一书
[/Quote]

有 资源管理模式 这本书吗?
pumanchawulaowu 2010-11-25
  • 打赏
  • 举报
回复
资源管理还是比较复杂的,有:对象池,缓存,延迟加载,生命周期管理,释放,监控等。你可以参考资源管理模式一书
pumanchawulaowu 2010-11-25
  • 打赏
  • 举报
回复
最近我也在作这方面的内容,可以一起讨论一下,下面提供参考:

protected long expirationTime = -1;
protected int minCapacity, maxCapacity;
protected HashMap<Resource<R, T>, Long> lockedMap, unLockedMap;
protected AtomicLong totalNumActive = new AtomicLong(0);

public abstract void init();
protected abstract Resource<R, T> create();
protected abstract void expire(Resource<R, T> res);
protected abstract boolean validate(Resource<R, T> res);
public abstract long getCurrentNumActvie();
public abstract long getTotalNumActive();
public abstract long getNumIdle();
public abstract void close();
public abstract void destroy();

public synchronized Resource<?,?> checkOut() {
long now = System.currentTimeMillis();
Resource<R, T> resource = null;

if (unLockedMap.size() > 0) {
Iterator<Resource<R, T>> keyIterator = unLockedMap.keySet().iterator();

while (keyIterator.hasNext()) {
resource = keyIterator.next();

if ((now - unLockedMap.get(resource)) > expirationTime) {
//object has expired
unLockedMap.remove(resource);
expire(resource);
resource = null;
} else {
if (validate(resource)) {
unLockedMap.remove(resource);
lockedMap.put(resource, new Long(now));
return resource;
} else {
// object failed validation
unLockedMap.remove(resource);
expire(resource);
resource = null;
}
}
}
}
// no objects available, create a new one
resource = create();
lockedMap.put(resource, new Long(now));
return resource;

}

public synchronized void checkIn(Resource<R, T> res) {
lockedMap.remove(res);
unLockedMap.put(res, new Long(System.currentTimeMillis()));
}


566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧